3 votes

Comment créer plusieurs objets dans un seul formulaire dans Rails 3.1 ?

J'ai un modèle de photo et je veux configurer un formulaire pour qu'un utilisateur puisse créer plusieurs photos à partir du même formulaire. J'ai regardé les Railscasts #196 et 197 sur les formulaires de modèles imbriqués mais c'est plus complexe que ce dont j'ai besoin et cela concerne plus les formulaires contenant plusieurs modèles, pas plusieurs objets du même modèle. Voici mon code pour un formulaire simple qui permet à un utilisateur de joindre une image et de créer un nouvel objet Photo. J'ai expérimenté avec fields_for et essayé l'imbrication mais cela semble trop compliqué et je n'arrive pas à le faire fonctionner. Avez-vous une idée de la façon dont je pourrais configurer ce formulaire pour permettre à l'utilisateur de joindre 5 images afin de créer 5 nouveaux objets Photo ?

<%= form_for(@photo, :html => { :class => "form-stacked", :multipart => "true" } )  do |f| %>
  <div class="clearfix">
    <%= f.file_field :image %>
  </div>
  <div><%= f.submit "Upload", :class => "btn primary" %></div>
<%end %>

1voto

kcurtin Points 176

J'ai fini par utiliser plupload pour les téléchargements multiples de fichiers (photos) avec carrierwave. J'ai utilisé la gemme plupload-rails et le code suivant et tout fonctionne bien :

<%= javascript_tag do %>
    $(function(){
        var uploader = $('#uploader').pluploadQueue({
            runtimes : "html5, gears,flash,silverlight,browserplus",
            max_image_size : '100mb',
            url : "/photos",
            unique_names : true,
            multipart: true,
            preinit: attachCallbacks,
            multipart_params: {
                "authenticity_token" : '<%= form_authenticity_token %>'
            },

            flash_swf_url : '/plupload/js/plupload.flash.swf',
            silverlight_xap_url : '/plupload/js/plupload.silverlight.xap'

        }); //end initial script

        //redirect after complete
        function attachCallbacks(uploader) {
            uploader.bind('FileUploaded', function(Up, File, Response) {
                if((uploader.total.uploaded + 1) == uploader.files.length){
                    var filesAdded = uploader.files.length;
                    window.location = "<%=j edit_individual_photos_path %>"+ '?files=' + filesAdded;
                }
            });
        }
    }); //end function
<% end %>

<div class="" id="uploader"></div>

J'espère que cela aidera quelqu'un à se lancer.

0voto

Robert Points 543

J'aime la gemme Ryan Bates Nested_Form, parce que je suis paresseux. Mais je ferais ceci

<%= semantic_nested_form_for @user, :html => {:multipart => true} do |f| %>

  <%= f.fields_for :photo %>
  <p><%= f.link_to_add "Add Photo", :photo %></p>

  <div class="actions">
    <%= f.submit :class => "btn-success" %>
  </div>

<% end %>

Puis un _photo.erb partiel

<div class="clearfix">
  <%= f.file_field :image %>
</div>

En ce qui concerne votre commentaire :

Je pense que c'est ce que vous cherchez, je l'ai fait pour vous ici (basé sur l'épisode de Railscast carrierwave) :

https://github.com/rbirnie/image-upload

Source de base :

Modèle de galerie

class Gallery < ActiveRecord::Base
  attr_accessible :name, :paintings_attributes
  has_many :paintings
  accepts_nested_attributes_for :paintings
end

Modèle de peinture :

class Painting < ActiveRecord::Base
  attr_accessible :gallery_id, :name, :image, :remote_image_url
  belongs_to :gallery
  mount_uploader :image, ImageUploader
end

Montage des galeries

<%= nested_form_for @gallery, :html => {:multipart => true} do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>

  <%= f.fields_for :paintings do |photo_form| %>
    <%= photo_form.label :name %>
    <%= photo_form.text_field :name %>
    <%= photo_form.file_field :image %>
    <%= photo_form.link_to_remove "Remove this photo" %>
  <% end %>

<p><%= f.link_to_add "Add a photo", :paintings %></p>

  <p><%= f.submit %></p>
<% end %>

~

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X