2010-05-20 10 views
9

tengo un modelo simpleusando fields_for en varios lugares

class Ad < ActiveRecord::Base 
    has_many :ad_items 
end 

class AdItem < ActiveRecord::Base 
    belongs_to :ad 
end 

tengo una "anuncios/nuevo" punto de vista, que me muestra la forma de crear el nuevo anuncio y la adición de algunos elementos a ella

el código es como un .html.erb siguiente:

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

Cuando el anuncio tiene un elemento ...

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 resultante, tendrá el siguiente aspecto:

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

Como se afirma en el código, yo uso fields_for método dos veces, debido a la estructura HTML, que debo seguir

Para la segunda llamada "fields_for", el índice para "item" ya es 1, no 0, como espero.

Es como, que llamando al método "fields_for", algunos contador interno se incrementa ...

Pero esto es un poco extraño comportamiento ...

He tratado de establecer: Índice => 0 para fields_for, pero todo sigue igual ...

¿Qué sucede aquí?

Respuesta

18

Puede configurar manualmente el índice para cada elemento, pero hay que iterar a través de sus artículos para que el índice de elemento para obtener:

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

Gracias, hombre! : ¡child_index era la clave! – AntonAL

Cuestiones relacionadas