如何编号嵌套字段?

时间:2013-04-01 19:31:10

标签: ruby-on-rails nested-forms

我正在构建具有has_manybelongs_to关系的嵌套字段,如下所示:

app/controllers/widgets_controller.rb

def new
  @widget = Widget.new
  3.times { @widget.gizmos.build }
end

app/views/widgets/_form.html.erb

<%= form_for @widget do |f| %>
  ...
  <%= f.fields_for :gizmos do |b| %>
    <%= render 'gizmo_fields', f: b %>
  <% end -%>
  ...
<% end -%>

app/views/widgets/_gizmo_fields.html.erb

<%= f.label :name "Gizmo -NUMBER-" %>
<%= f.text_field :name %>

如何以编程方式确定gizmo总数中widget.gizmos的数量。这样每个输出看起来像:

Gizmo 1 |_____text_____|
Gizmo 2 |_____text_____|
Gizmo 3 |_____text_____|

我想避免的事情:

  • 使用Javascript - 我知道我可以使用vanilla javascript或jquery对这些进行编号。我想要一个纯ruby / rails解决方案,这样不仅可以更容易理解代码,而且我希望了解有关嵌套字段的更多信息。
  • 增加变量 - 同样,我想了解更多有关嵌套字段的上下文的信息,看看是否有更动态,更具体的方法来对嵌套字段进行编号。

我已经知道的事情:

  • 我可以通过gizmo
  • 访问f.object的当前实例
  • 我无法在f.object.widget操作上访问new,因为记录尚未保存

2 个答案:

答案 0 :(得分:1)

嗯,我想我很接近。我收拾了所有的东西,只需把它们放在一起。由于我可以访问formbuilder的对象,我可以在与@widget的关联数组中找到它的位置

<%= f.fields_for :gizmos do |b| %>
  <%= render 'gizmo_fields', f: b, index: @widget.gizmos.index(b.object) + 1 %>
<% end -%>

app/views/widgets/_gizmo_fields.html.erb

<%= f.label :name "Gizmo #{index}" %>
<%= f.text_field :name %>

答案 1 :(得分:0)

我相信你的部分中有一个变量'PARTIAL_NAME_counter',即

gizmo_fields_counter

请参阅http://databasically.com/2009/04/09/rails-render-partial-counters-displaying-a-records-index/