【问题标题】:How do I access ActionView's fields_for index when iterating over many child records?遍历多个子记录时如何访问 ActionView 的 fields_for 索引?
【发布时间】:2011-06-14 20:57:19
【问题描述】:

我有一个 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 %>

顺便说一句,我可以为字段创建自定义 id 值,但更愿意遵守约定。

【问题讨论】:

  • 没有找到任何方法来访问 fields_for 迭代器上的 @auto_index 我已经解决了眼前的问题;我刚刚为循环创建了自己的索引。

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


【解决方案1】:

或者,您可以为相关元素分配一个 CSS 类,然后通过查找该类的所有元素将您的侦听器连接到 dom:ready。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2019-08-29
    • 2021-10-13
    相关资源
    最近更新 更多