2010-05-20 18 views
9

j'ai un modèle simpleen utilisant fields_for en plusieurs endroits

class Ad < ActiveRecord::Base 
    has_many :ad_items 
end 

class AdItem < ActiveRecord::Base 
    belongs_to :ad 
end 

J'ai une « annonces/nouvelle » vue, qui me montre la forme pour la création de la nouvelle annonce et en ajoutant quelques articles à ce

le code .html.erb est comme un suivant:

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

Lorsque l'annonce a un article ...

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 

... résultant HTML, ressemblera à ceci:

<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> 

Comme il est dit dans le code, j'utilise la méthode fields_for deux fois, en raison de la structure HTML, que je dois suivre

Pour le deuxième appel "fields_for", l'index de "item" est déjà 1, et non 0, comme je l'espère.

Il est comme, en appelant la méthode que « fields_for », un certain compteur interne est incrémenté ...

Mais c'est un peu étrange comportement ...

J'ai essayé de définir: index => 0 pour fields_for, mais tous restent les mêmes ...

Qu'est-ce qui ne va pas ici?

Répondre

18

Vous pouvez définir manuellement l'index pour chaque élément, mais vous devez parcourir vos articles pour que, pour obtenir l'index d'article:

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

Merci, mec! : child_index était la clé! – AntonAL