использование fields_for в нескольких местах

У меня есть простая модель

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, но все остается таким же...

Что случилось здесь?

9
задан AntonAL 20 May 2010 в 12:59
поделиться

1 ответ

Вы можете установить индекс вручную для каждого элемента, но для этого вам нужно перебрать свои элементы, чтобы получить индекс элемента:

  <% 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 %>
18
ответ дан 4 December 2019 в 11:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: