Je ne vois pas de moyen décent de le faire par les moyens fournis par Rails, du moins pas dans -v3.2.14
@Sheharyar Naseer fait référence aux options de hachage qui peuvent être utilisées pour résoudre le problème mais pas, pour autant que je puisse le voir, de la manière dont il semble le suggérer.
J'ai fait ça =>
<%= 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 %>
o
<%= 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 %>
Dans mon cas g.object_name
retourne une chaîne de caractères comme ceci "gallery_set[blog_posts_attributes][2]"
pour le troisième champ rendu, donc je fais juste correspondre l'index dans cette chaîne et je l'utilise.
En fait, une façon plus cool (et peut-être plus propre ?) de le faire est de passer une lambda et de l'appeler pour incrémenter.
# /controller.rb
index = 0
@incrementer = -> { index += 1}
Et le dans la vue
<%= 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 %>
3 votes
J'en ai + un dans les rails de base... Je continue à trouver un cas pour celui-ci aussi.