我如何访问迭代计数器?

时间:2011-07-19 18:50:41

标签: ruby-on-rails ruby ruby-on-rails-3

在Ruby on Rails中,如何在循环中访问迭代计数器?

以下工作,但使用child_number变量有点黑客。有没有更好的方法来实现这一目标?

<% 5.times { @parent.child.build } %>

<%= form_for @parent do |parent_form| %>
  <p>
    <%= parent_form.label :full_name, "Parent's name" %>
    <%= parent_form.text_field :full_name %>
  </p>

  <%= parent_form.fields_for :children do |child_form| %>
    <% @child_number ||= 1 %>
    <p>
      <%= child_form.label :full_name, "Child #{@child_number}'s name" %>
      <%= child_form.text_field :full_name %>
    </p>
    <% @child_number += 1 %>
  <% end %>

  <p>
    <%= parent_form.submit %>
  </p>
<% end %>

3 个答案:

答案 0 :(得分:6)

好吧,它将出现在Rails 3.2中 - https://github.com/rails/rails/pull/1189

  

......我会将其分配给3.2里程碑......

它看起来像https://github.com/jmbejar/rails/commit/7c562d5e460d97b18e4f3367b3cfb13401732920

现在你可以使用类似的东西:

<% 5.times { @parent.child.build } %>

<%= form_for @parent do |parent_form| %>
  ...
  <%= parent_form.fields_for :children do |child_form| %>
    <p>
      <%= child_form.label :full_name, "Child #{child_form.object_name.gsub(/[^0-9]+/,'')}'s name" %>
      <%= child_form.text_field :full_name %>
    </p>
  <% end %>
  ...
<% end %>

答案 1 :(得分:-1)

这只是索引关联:

<% 5.times do {@parent.children.build } %> 
#should be in your controller

    <%= form_for @parent do |parent_form| %>
        <%= parent_form.fields_for :children do |child_form| %>
            This will return the index
            <%= parent_form.object.children.index(child_form.object) %>
        <% end %>
    <% end %> 

确保我的关联正确,但逻辑很好。

答案 2 :(得分:-1)

使用可枚举 each_with_index

       ().each_with_index do |elem,i|
        end