Я не могу найти достойного способа сделать это способами, предоставляемыми Rails, по крайней мере, не в -v3.2.14
@ Sheharyar Naseer ссылается на хэш опций, который можно использовать для решения проблемы, но не настолько, насколько я могу судить по тому, как он предлагает.
Я сделал это =>
<%= f.fields_for :blog_posts, {:index => 0} do |g| %>
<%= g.label :gallery_sets_id, "Position #{g.options[:index]}" %>
<%= g.select :gallery_sets_id, @posts.collect { |p| [p.title, p.id] } %>
<%# g.options[:index] += 1 %>
<% end %>
или
<%= f.fields_for :blog_posts do |g| %>
<%= g.label :gallery_sets_id, "Position #{g.object_name.match(/(\d+)]/)[1]}" %>
<%= g.select :gallery_sets_id, @posts.collect { |p| [p.title, p.id] } %>
<% end %>
В моем случае g.object_name
возвращает строку, подобную этой, "gallery_set[blog_posts_attributes][2]"
для третьего отображаемого поля, поэтому я просто сопоставляю индекс в этой строке и использую его.
На самом деле, круче (а может и чище?) Способ сделать это - передать лямбду и вызывать ее для приращения.
# /controller.rb
index = 0
@incrementer = -> { index += 1}
А в поле зрения
<%= f.fields_for :blog_posts do |g| %>
<%= g.label :gallery_sets_id, "Position #{@incrementer.call}" %>
<%= g.select :gallery_sets_id, @posts.collect { |p| [p.title, p.id] } %>
<% end %>