2010-06-24 53 views
1

不知怎的,我下的印象是accepts_nested_attributes_for會讓我通過家長填寫子對象:混淆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提到僅僅間接爲accep_nested_attributes_和這個方法的API文檔也很神祕。

1)有人可以顯示accept_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

不是'form_for:people'而不是'fields_for'嗎? – 2010-06-24 20:31:00

+0

@j。不,我有幾個'人'記錄的表單聲明。總體而言,在http://guides.rubyonrails.org上的某個地方,據說fields_for與form_for的所有實際用途相同,但不會創建

元素。 – 2010-06-24 20:33:39

+0

我有_ <%form_tag(「url_here」,:method =>「post」,:id =>「edit_tips_form」)do%> _包含所有內容。 – 2010-06-24 20:35:31

回答

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 

。正如你所說的,只需要更多優雅的代碼即可完成。

+0

實際上,我以同樣的方式聲明表單,但我用樣式「people [66] [address] [street]」獲取參數名稱,而不是「人們[66] [address_attributes] [street]「 – 2010-06-24 20:24:59

+0

也更新了表單聲明的問題。謝謝! – 2010-06-24 20:29:20