2010-05-20 2 views
9

у меня есть простая модельиспользование 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» индекс для «item» уже равен 1, а не 0, как я ожидаю.

Это похоже, что по телефону «fields_for» метод, какой-то внутренний счетчик увеличивается ...

Но это немного странное поведение ...

Я попытался установить: индекс => 0 для fields_for, но все остается неизменным ...

Что здесь не так?

ответ

18

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

<% 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 %> 
+3

Спасибо, человек! : child_index был ключом! – AntonAL