Nie widzę przyzwoitego sposobu na zrobienie tego poprzez sposoby zapewniane przez Railsy, przynajmniej nie w -v3.2.14
@Sheharyar Naseer odnosi się do skrótu opcji, którego można użyć do rozwiązania problemu, ale nie na tyle, na ile widzę, w sposób, który wydaje się sugerować.
Zrobiłem to =>
<%= 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 %>
lub
<%= 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 %>
W moim przypadku g.object_name
zwraca taki ciąg"gallery_set[blog_posts_attributes][2]"
dla trzeciego renderowanego pola, więc po prostu dopasowuję indeks w tym ciągu i używam go.
Właściwie fajniejszym (i może czystszym?) Sposobem na zrobienie tego jest przekazanie lambdy i wywołanie jej przyrostu.
# /controller.rb
index = 0
@incrementer = -> { index += 1}
I w widoku
<%= 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 %>