Question

J'ai un modèle simple

class Ad < ActiveRecord::Base
   has_many :ad_items
end

class AdItem < ActiveRecord::Base
   belongs_to :ad
end

J'ai une « annonces / nouvelle » vue, qui montre moi la forme pour créer la nouvelle annonce et en ajoutant quelques éléments à 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 élément ...

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 résultant, 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 fields_for méthode deux fois, en raison de la structure HTML, que je dois suivre

Pour la deuxième "fields_for" appel, index "item" est déjà 1, 0, comme je le pense.

Il est comme, qu'en appelant « fields_for » méthode, un certain compteur interne sera incrémentée ...

Mais cela est un peu étrange comportement ...

J'ai essayé de définir: index => 0 pour fields_for, mais tous reste le même ...

Quel est le problème ici?

Était-ce utile?

La solution

Vous pouvez définir manuellement l'index pour chaque élément, mais vous devez itérer à travers vos articles pour que, pour obtenir l'index de l'élément:

  <% 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 %>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top