关于accepts_nested_attributes_for的困惑

时间:2010-06-24 18:54:03

标签: ruby-on-rails ruby

不知何故,我的印象是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]

1 个答案:

答案 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

不是错误。正如你所说,可以使用更多优雅的代码完成。