我有两种模式:
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
答案 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
重命名为Message
或MessageThread
。
正在发生的事情是Thread
是在您的应用代码之前加载的核心类。内存中已经存在Thread
类,当您第一次引用它时,Rails不会在开发模式下查找它。当引用thread.rb
但当前未加载时,Rails通过查找Thread
文件来按需加载您的类。
在生产模式下,Rails在启动时加载所有类,不同的基类(Object
vs ActiveRecord::Base
)将产生TypeError
。
答案 1 :(得分:1)
Thread
是Ruby中的保留字 - 我建议重命名模型。