迭代许多子记录时,如何访问ActionView的fields_for索引?

时间:2011-01-24 23:23:21

标签: ruby-on-rails forms nested-forms nested-attributes actionview

我有一个Rails 2.3.10应用程序,它使用fields_for在has_many关联的属性中包含字段。我在父模型上使用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 %>

BTW我可以为该字段创建自定义ID值,但更愿意遵守惯例。

1 个答案:

答案 0 :(得分:0)

或者你可以为有问题的元素分配一个CSS类,然后在dom上连接你的监听器:准备好找到这个类的所有元素。