2

Railscasts#198のように、1つのフォームのインデックスビューで親モデルの複数のインスタンスを編集しています。Railscasts#196および#197のように、各親にはhas_many:childrenおよびaccepts_nested_attributes_for:childrenがあります。

<%= 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を取得しますが、子インデックス用の配列スロットを提供しません。

「[]children[]」も正しくありません:id = "parents_1__children_3_chore"

3_choreではなくattributes_0_choreを期待していたので。

これを機能させるには、FormBuilderオブジェクトの属性またはサブクラスFormBuilderを直接変更する必要がありますか、それともこの状況に適合する構文がありますか?

考えてくれてありがとう。

4

1 に答える 1

6

FormBuilder.fields_forのソースコードを読んで、この問題を解決しました

考えられる答えの 1 つ: はい、FormBuilder オブジェクトの f.object_name 属性を変更します。

具体的にはこの状況で

f.fields_for :children  

電話するつもりです

f.fields_for_with_nested_attributes

f.object_name に基づいて name 変数を設定します。生成された要素の ID は名前に基づいているように見えるため、結果の html では両方が一致します。

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

したがって、f.fields_for に私が望んでいたことを行うように指示する 1 つの方法は、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 ヘルパーを変更せずに使用できます。

于 2011-06-30T22:01:02.537 に答える