【问题标题】:NoMethodError (undefined method `each' for #<Todo:0x000055f72c0896b0>)NoMethodError(#<Todo:0x000055f72c0896b0> 的未定义方法“每个”)
【发布时间】:2018-12-28 20:15:51
【问题描述】:

我正在尝试使用项目和该项目的一些任务制作简单的网络应用程序。 Oracle VM 上的 Ubuntu 18.10、Ruby 2.5.3p105、Rails 5.2.2、Postgresql 10

当我尝试在 Rails 控制台中测试它时,我可以毫无问题地创建项目,但是当我尝试创建 todo 时,我得到了这个

2.5.3 :001 > project = Project.create title: "My project"
   (0.2ms)  BEGIN
  Project Create (0.8ms)  INSERT INTO "projects" ("title", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["title", "My project"], ["created_at", "2018-12-28 20:10:57.929619"], ["updated_at", "2018-12-28 20:10:57.929619"]]
   (15.1ms)  COMMIT
 => #<Project id: 2, title: "My project", created_at: "2018-12-28 20:10:57", updated_at: "2018-12-28 20:10:57"> 
2.5.3 :002 > todo = Todo.create text: "Some random task"
   (0.3ms)  BEGIN
   (0.3ms)  ROLLBACK
 => #<Todo id: nil, project_id: nil, text: "Some random task", created_at: nil, updated_at: nil, isCompleted: false> 
2.5.3 :003 > project.todos = Todo.create text: "Some random task"
   (0.3ms)  BEGIN
   (0.2ms)  ROLLBACK
Traceback (most recent call last):
        1: from (irb):3
NoMethodError (undefined method `each' for #<Todo:0x00007f7ab02c91d8>)

这是我的迁移

class CreateProjects < ActiveRecord::Migration[5.2]
  def change
    create_table :projects do |t|
      t.string :title
      t.timestamps
    end

    create_table :todos do |t|
      t.belongs_to :project, index: true
      t.text :text
      t.timestamps
    end
    add_column :todos, :isCompleted, :boolean, :default => false
  end
end

这是我的项目和待办事项模型

class Project < ApplicationRecord
  has_many :todos
end

class Todo < ApplicationRecord
  belongs_to :project
end 

那么我做错了什么,我怎样才能让它发挥作用?

【问题讨论】:

    标签: ruby-on-rails ruby nomethoderror ruby-on-rails-5.2


    【解决方案1】:

    我做错了什么

    您将单个待办事项传递给需要待办事项集合的方法。

    我怎样才能让它工作?

    这是一种更惯用的方式:

    project.todos.create(text: "Some random task")
    

    阅读本指南,会有所帮助:https://guides.rubyonrails.org/association_basics.html

    【讨论】:

    • @stulentsev 谢谢,工作就像一个魅力。你有什么想法为什么只是 Todo.create text: "..." 不起作用?在这个项目的演练中,它完全写在检查段落中
    • @ncux1699 为什么是的,我知道 :) 由于 rails 5(如果我没记错的话),belongs_to 添加了一个必填字段。您正在尝试创建一个没有项目的待办事项。
    猜你喜欢
    • 2015-10-05
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 2013-04-24
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多