Rails 3 - 使用build -error,未定义的方法`build'for#

时间:2011-01-30 02:30:01

标签: ruby-on-rails ruby-on-rails-3

我有两种模式:

class Thread < ActiveRecord::Base
  has_many :attachments
end

class Attachment < ActiveRecord::Base
  belongs_to :thread
end

创建新线程时,我想在保存之前构建附件。我在做:

@thread.attachments.build(...)

但是错误的是:failed with NoMethodError: undefined method `build' for #<Class:0x10338c828

2 个答案:

答案 0 :(得分:3)

您应该可以使用@thread.attachments.build创建新的未保存附件。

如果:autosave => true上有has_many(明确地或通过accepts_nested_attributes_for),则会在父线程保存时保存它们。

您可能需要在保存新记录的关联上设置:inverse_of才能正常工作:

class Thread < ActiveRecord::Base
  has_many :attachments, :inverse_of => :thread, :autosave => true
end

class Attachment < ActiveRecord::Base
  belongs_to :thread, :inverse_of => :attachments
end

如@zetetic所述:Thread是一个内置的Ruby类,您不应该在应用程序中使用与系统类相同的名称。

您学习不使用任何语言的课程。在这种情况下,我会在我的类名中添加一些内容,使其更具描述性,假设完全没有更好的名称。对您的应用进行了测试,您应该将其从Thread重命名为MessageMessageThread

正在发生的事情是Thread是在您的应用代码之前加载的核心类。内存中已经存在Thread类,当您第一次引用它时,Rails不会在开发模式下查找它。当引用thread.rb但当前未加载时,Rails通过查找Thread文件来按需加载您的类。

在生产模式下,Rails在启动时加载所有类,不同的基类(Object vs ActiveRecord::Base)将产生TypeError

答案 1 :(得分:1)

Thread是Ruby中的保留字 - 我建议重命名模型。