2010-10-22 4 views
0

J'ai deux modèles, Product et ProductImage, et j'aimerais offrir la possibilité d'ajouter jusqu'à 6 images à chaque produit.form.fields_for faire pour un nombre fini de fois

Produit

has_many :product_images, :dependent => :destroy 

tout productImage

belongs_to :product 

Jusqu'à présent, mon point de vue sont les suivantes:

#products/_form.html.erb. 
    <% @product.product_images.build %> 
    <%= form_for(@product, :html => { :multipart => true }) do |product_form| %> 
     <% if @product.errors.any? %> 
     <div id="error_explanation"> 
      <h2><%= pluralize(@product.errors.count, "error") %> prohibited this product from being saved:</h2> 

      <ul> 
      <% @product.errors.full_messages.each do |msg| %> 
      <li><%= msg %></li> 
      <% end %> 
      </ul> 
     </div> 
     <% end %> 

     <div class="field"> 
     <%= product_form.label :title %><br /> 
     <%= product_form.text_field :title %> 
     </div> 
     <div class="field"> 
     <%= product_form.label :description %><br /> 
     <%= product_form.text_area :description %> 
     </div> 
     <div class="field"> 
     <%= product_form.label :price %><br /> 
     <%= product_form.text_field :price %> 
     </div> 
     <div id="product_images"> 
      <%= render :partial => 'product_images/form', :locals => {:form => product_form} %> 
     </div> 
     <div class="actions"> 
     <%= product_form.submit %> 
     </div> 
    <% end %> 

et

#product_images/_form.html.erb 
    <%= form.fields_for :product_images do |product_image_form| %> 
     <div class="image"> 
      <%= product_image_form.label :image, 'Image:' %> 
      <%= product_image_form.file_field :image %> 
     </div> 
     <% unless product_image_form.object.nil? || product_image_form.object.new_record? %> 
     <div class="image"> 
      <%= product_image_form.label :_destroy, 'Remove:' %> 
      <%= product_image_form.check_box :_destroy %> 
     </div> 
     <% end %> 
    <% end %> 

La question est: comment puis-je forcer ma forme partielle pour imprimer 6 file_fields différents, chacun avec son propre nom d'attribut unique, .: par exemple

name="product[product_images_attributes][0][image]" 
name="product[product_images_attributes][1][image]" 

et ainsi de suite? Je veux dire, est-ce encore possible ou existe-t-il un moyen meilleur et différent d'obtenir un tel résultat? Je pensais pouvoir ajouter autant de champs avec link_to et AJAX mais je suppose qu'il est beaucoup plus facile pour l'utilisateur d'avoir les six champs imprimés et prêts, au lieu de cliquer sur un lien à chaque fois pour ajouter un champ .

Répondre

2

En supposant que vous utilisez accepts_nested_attributes_for :product_images dans votre modèle, vous avez besoin de quelque chose comme ce qui suit dans votre ProdcutsController:

def new 
    @product = Product.new 
    6.times { @product.product_images.build } # this will create 6 "blank product_images" 
end 

def edit 
    @product = Product.find(params[:id]).includes(:product_images) 
    (6 - @product.product_images.size).times { @product.product_images.build } # this will create as many "blanks" as needed 
end 

Pour les nouveaux produits, vous build 6 nouvelles images de produits pour les produits existants que vous build seulement autant que Vous devez disposer de 6.

Modifier: Supprimez également la ligne <% @product.product_images.build %> de la vue products/_form.html.erb car vous êtes build à la place des instances associées dans votre contrôleur.

+0

Cela fonctionne parfaitement. Merci beaucoup, Teoulas. – Neko

+0

Teoulas, savez-vous où ce genre de chose est documentée? Je veux vraiment en savoir plus sur la gestion des attributs imbriqués, mais les documentations sont très rares sur ce sujet. – vinhboy

+0

Vous pouvez toujours regarder le code si vous voulez en savoir plus sur les attributs internes des attributs imbriqués. Le concept est assez simple, il configure simplement des méthodes getter/setter pour les attributs de modèle associés. Voici la documentation officielle: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html – Teoulas

Questions connexes