我已升级到Rails 2.3.3(从2.1.x开始),我正试图找出accepts_nested_attributes_for方法.我可以使用该方法更新现有的嵌套对象,但我无法使用它来创建新的嵌套对象.鉴于人为的例子:
class Product < ActiveRecord::Base
has_many :notes
accepts_nested_attributes_for :notes
end
class Note < ActiveRecord::Base
belongs_to :product
validates_presence_of :product_id, :body
end
Run Code Online (Sandbox Code Playgroud)
如果我尝试Product使用嵌套创建一个新的,Note如下所示:
params = {:name => 'Test', :notes_attributes => {'0' => {'body' => 'Body'}}}
p = Product.new(params)
p.save!
Run Code Online (Sandbox Code Playgroud)
它使用以下消息验证失败:
ActiveRecord::RecordInvalid: Validation failed: Notes product can't be blank
Run Code Online (Sandbox Code Playgroud)
我明白为什么会这样 - 这是因为validates_presence_of :product_id在Note课堂上,并且因为在保存新记录时,该Product对象没有id.但是,我不想删除此验证; 我认为删除它是不正确的.
我也可以通过手动创建第Product一个,然后添加Note,但这会破坏简单性来解决问题accepts_nested_attributes_for.
是否有标准的Rails方法在新记录上创建嵌套对象?
rya*_*anb 16
这是一个常见的循环依赖问题.有一个现有的灯塔票,这是值得一试.
我希望在Rails 3中有很大的改进,但与此同时你必须做一个解决方法.一种解决方案是设置嵌套时设置的虚拟属性,以使验证成为条件.
class Note < ActiveRecord::Base
belongs_to :product
validates_presence_of :product_id, :unless => :nested
attr_accessor :nested
end
Run Code Online (Sandbox Code Playgroud)
然后,您将此属性设置为表单中的隐藏字段.
<%= note_form.hidden_field :nested %>
Run Code Online (Sandbox Code Playgroud)
这应该足以在nested通过嵌套表单创建注释时设置属性.未经测试.
如果您使用Rails3,请检查此文档.
| 归档时间: |
|
| 查看次数: |
6896 次 |
| 最近记录: |