ฉันไม่เห็นวิธีที่ดีในการทำสิ่งนี้ผ่านทาง 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] } %>
<%
<% 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]"
สำหรับฟิลด์ที่สามที่แสดงผลดังนั้นฉันจึงจับคู่ดัชนีในสตริงนั้นและใช้มัน
จริงๆแล้ววิธีที่เย็นกว่า (และอาจจะสะอาดกว่า?) คือการส่งแลมด้าและเรียกมันว่าเพิ่มขึ้น
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 %>