如何使用fields_for“ parents []”获得正确的孩子ID,父母做| f |。使用f.fields_for:children,child?

| 我正在以一种形式在索引视图中编辑父模型的多个实例,如Railscasts#198中所示。 每个父母都有has_many:children和accepts_nested_attributes_for:children,如Railscasts#196和#197
<%= 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:job正确生成
<input id=\"parents_1_job\" type=\"text\" value=\"coding\" size=\"30\" name=\"parents[1][job]\">  
但是cf.text_field:chore生成没有父级索引的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 %>  
我也一样如果将方法从:children更改为\“ [] children \”,我会得到 id = \“ parents_1 ___ children_chore \” 它获得正确的parent_index,但不为子索引提供数组槽。 \“ []儿童[] \”也不正确:   id = \“ parents_1__children_3_chore \” 如我所期望的,属性_0_chore而不是3_chore。 我是否需要直接修改FormBuilder对象的属性或FormBuilder的子类以使其起作用,或者是否有适合这种情况的语法? 感谢您的任何想法。     
已邀请:
        我确实通过阅读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块中的所有内容都可以使用未修改的标准rails助手。     

要回复问题请先登录注册