2011-06-24 58 views
1

我正在一種形式的索引視圖中編輯父模型的多個實例,如在Railscasts#198中。 每個父的has_many:兒童和accepts_nested_attributes_for:兒童,在Railscasts#196和#197如何使用fields_for「parents []」獲得正確的兒童id,parent do | f |使用f.fields_for:孩子,孩子?

<%= form_tag %> 
    <% for parent in @parents %> 
    <%= fields_for "parents[]", parent do |f| 
     <%= f.text_field :job %> 
     <%= f.fields_for :children do |cf| %> 
     <% cf.text_field :chore %> 
     <% end %> 
    <% end %> 
    <% end %> 
<% end %> 

鑑於parent.id == 1
f.text_field:工作正確生成

<input id="parents_1_job" type="text" value="coding" size="30" name="parents[1][job]"> 

但cf.text_field:雜項生成沒有父索引的ID和名稱。

id="parents_children_attributes_0_chore" 
name="parents[children_attributes][0][chore]"  

如果我試圖通過具體的子對象f.fields_for這樣的:

<% for child in parent.children %> 
    <%= f.fields_for :children, child do |cf| %> 
    <%= cf.text_field :chore %> 
    <% end %> 
<% end %> 

我得到相同。如果我從改變方法:孩子「[]孩子們」我得

ID =「parents_1 ___ children_chore」

它得到正確的parent_index但不提供子指標的數組插槽。

「[]兒童[]」 是不正確的之一: ID = 「parents_1__children_3_chore」

我期待3_chore的attributes_0_chore代替。

我是否需要直接修改FormBuilder對象的屬性或FormBuilder的子類來使其工作,或者是否存在符合此情況的語法?

感謝您的任何想法。

回答

6

我做閱讀的源代碼FormBuilder.fields_for

一個可能的答案解決這個問題:是的,修改FormBuilder對象的f.object_name屬性。

特別是在這種情況下

f.fields_for :children 

會調用

f.fields_for_with_nested_attributes 

這臺基於f.object_name名稱變量。生成的元素的id看起來像基於名稱,所以兩者都匹配在生成的html中。

def fields_for_with_nested_attributes(association_name, args, block) 
     name = "#{object_name}[#{association_name}_attributes]" 
..... 

所以一個告訴f.fields_for做什麼,我想的辦法是設置f.object_name以包括f.fields_for塊的時間內父ID

<% old_object_name = f.object_name %> 
<% f.object_name="parents[#{f.object.id}]" %> 
<% =f.fields_for :children do |cf| %> 
    <%= cf.text_field :chore %> 
<% end %> 
<% f.object_name=old_object_name #should be "parents[]" %> 

那麼一切f.fields_for塊可以使用未修改的標準導軌輔助器。