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 .
Cela fonctionne parfaitement. Merci beaucoup, Teoulas. – Neko
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
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