У меня есть простая модель
class Ad < ActiveRecord::Base
has_many :ad_items
end
class AdItem < ActiveRecord::Base
belongs_to :ad
end
У меня есть представление "рекламы" / новое" представление, которое показывает мне форму для создания новой рекламы и добавления некоторых объектов к нему
Код .html.erb похож на следующее:
<% form_for @ad, do |ad_form| %>
<!-- some html -->
<% ad_form.fields_for :ad_items do |f| %>
<%= f.text_area "comment", :class => "comment", :rows => "5" %>
<% end %>
<!-- some other html -->
<% ad_form.fields_for :ad_items do |f| %>
<% render :partial => "detailed_item_settings", :locals => {:f => f} %>
<% end %>
<% end %>
Когда реклама имеет один объект...
def new
@ad = session[:user].ads.build
# Create one item for the ad. Another items will be created on the
# client side
@ad.ad_items.build
# standard stuff ...
end
... получающийся HTML, будет похож на это:
<form ... >
<!-- some html -->
<textarea id="ad_items_attributes_0_comment" name="ad[ad_items_attributes][0][comment]" />
<!-- some other html -->
<!-- "detailed_item_settings" partial's content -->
<textarea id="ad_ad_items_attributes_1_desc" name="ad[ad_items_attributes][1][desc]" />
<!-- end -->
</form>
Как это указывает в коде, я использую fields_for метод дважды из-за структуры HTML, за которой я должен следовать
Для второго вызова "fields_for" индекс для "объекта" уже равняется 1, не 0, как я ожидаю.
Похоже, что путем вызова "fields_for" метода, некоторый внутренний счетчик будет увеличен...
Но это - немного странного поведения...
Я попытался установить: индексируйте => 0 для fields_for, но все остается таким же...
Что случилось здесь?
Вы можете установить индекс вручную для каждого элемента, но для этого вам нужно перебрать свои элементы, чтобы получить индекс элемента:
<% ad_form.fields_for :ad_items do |f| %>
<%= f.text_area "comment", :class => "comment", :rows => "5" %>
<% end %>
...
<% ad_items.each_with_index do |item, i| %>
<% ad_form.fields_for :ad_items, item, :child_index => i do |f| %>
<% render :partial => "detailed_item_settings", :locals => {:f => f} %>
<% end %>
<% end %>