fields_for を使用して has_many 関連付けの属性にフィールドを含める Rails 2.3.10 アプリがあります。親モデルでaccepts_nested_attributes_forを使用しており、その多くの子が次を使用してフォームに表示されています。
<% form_for :map do |f| %>
...
<% f.fields_for :markers do |marker_f| %>
<%= marker_f.text_field :lat
<%= marker_f.text_field :long
<% end %>
<% end %>
fields_for ヘルパーは子マーカー モデルを繰り返し処理し、それぞれに対して text_field 入力が生成されます。これらのテキスト フィールドは、次のような id 値を生成しました。
map_markers_attributes_0_lat および map_markers_attributes_0_long
map_markers_attributes_1_lat および map_markers_attributes_1_long
...
map_markers_attributes_5_lat および map_markers_attributes_5_long
id の整数は、反復されるレコード配列のインデックスです。コードの他の場所で使用するために、このインデックス値にアクセスするにはどうすればよいですか?
たとえば、Javascript を使用してこれらの入力の id 値にアクセスしたいとします。
<% form_for :map do |f| %>
...
<% f.fields_for :markers do |marker_f| %>
<%= marker_f.text_field :lat
<%= marker_f.text_field :long
<% content_for :head do %>
<% javascript_tag do %>
$('<%= generate_html_id(marker_f, :lat) %>').observe_field('change');
$('<%= generate_html_id(marker_f, :long) %>').observe_field('change');
<% end %>
<% end %>
<% end %>
<% end %>
html の先頭に JavaScript を挿入して、フィールドの変更を観察します。フィールドの ID を知る必要があり、generate_html_id メソッドは、marker_f ビルダー オブジェクトからフィールドの ID を複製できる必要があります。ただし、fields_for からのインデックス値を取得する方法がわかりません。
fields_for_with_index メソッドが必要なようですが、ありません:
<% form_for :map do |f| %>
...
<% f.fields_for_with_index :markers do |marker_f, i| %>
<%= marker_f.text_field :lat
<%= marker_f.text_field :long
<% content_for :head do %>
<% javascript_tag do %>
$('<%= generate_html_id(marker_f, :lat, i) %>').observe_field('change');
$('<%= generate_html_id(marker_f, :long, i) %>').observe_field('change');
<% end %>
<% end %>
<% end %>
<% end %>
ところで、フィールドのカスタム id 値を作成することもできますが、慣習に従うことをお勧めします。