不知何故,我的印象是accepts_nested_attributes_for
会让我通过父母填充子对象:
person.update_attributes person_hash
但实际上我最终做到了这一点:
person.address.update_attributes person_hash[:address]
person_hash.delete :address
person.update_attributes person_hash
现在,http://guides.rubyonrails.org仅间接提到accepted_nested_attributes_for,此方法的API文档也非常神秘。
1)有人可以显示accepts_nested_attributes_for的基本用例吗?我的意思是,我理解它是如何宣布的,我对它的不同感到困惑。
2)我在嵌套对象中填充“正确”的方式,还是有更“优雅”的东西?
谢谢!
更新
模型,为清晰起见
class Person < ActiveRecord::Base
has_one :address
accepts_nested_attributes_for :address
end
update2 ,对于j。
表格声明就像这样
<% fields_for "people", person, :index => person.id do |person_form| %>
...
<% person_form.fields_for person.address do |address_form| %>
<%= address_form.text_field :street %>
<% end %>
...
<% end %>
但它给了我html名称,如people[66][address][street]
而不是people[66][address_attributes][street]
答案 0 :(得分:3)
使用accepts_nested_attributes_for
,您可以执行以下操作:
# example from railsapi.com
# view
<% form_for @person, :url => { :action => "create" } do |person_form| %>
Name: <%= person_form.text_field :name %>
...
<% person_form.fields_for :address do |address_fields| %>
Street : <%= address_fields.text_field :street %>
Zip code: <%= address_fields.text_field :zip_code %>
<% end %>
<% end %>
这样,您的参数将如下所示
params = {
:person => {
:name => 'Jack',
:address_attributes => { :street => 'Street', :zip_code => '11111' }
}
}
您可以使用
创建人员和相关地址@person = Person.create(params)
有关详细信息,请railsapi.com
。我希望它有所帮助。
修改强>
我不知道为什么你的params看起来像这样:/ 但是使用
#person.address.update_attributes person_hash.delete(:address) OR
person.address.update_attributes person_hash[:address]
person_hash.delete :address
person.update_attributes person_hash
不是错误。正如你所说,可以使用更多优雅的代码完成。