Tôi không thể thấy một cách hợp lý nào để làm điều này thông qua các cách được cung cấp bởi Rails, ít nhất là không phải trong -v3.2.14
@Sheharyar Naseer đề cập đến các tùy chọn băm có thể được sử dụng để giải quyết vấn đề nhưng không xa như tôi có thể thấy theo cách mà anh ấy có vẻ đề xuất.
Tôi đã làm điều này =>
<%= 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 %>
hoặc là
<%= 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 %>
Trong trường hợp của tôi, g.object_name
trả về một chuỗi như thế này"gallery_set[blog_posts_attributes][2]"
cho trường thứ ba được hiển thị, vì vậy tôi chỉ cần khớp chỉ mục trong chuỗi đó và sử dụng nó.
Trên thực tế, một cách làm mát hơn (và có thể sạch hơn?) Là chuyển một lambda và gọi nó để tăng dần.
# /controller.rb
index = 0
@incrementer = -> { index += 1}
Và trong khung cảnh
<%= 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 %>