2011-10-03 2 views
7

J'essayais de télécharger plusieurs images avec libellfly dans rails3. J'ai cherché quelques tutoriels, mais je n'en ai pas trouvé. je l'ai trouvé un tutoriel pour envoyer plusieurs fichiers d'image avec Carrierwave, mais ne pourrais pas trouver de chance avec libellule .. toute aide :) s'il vous plaîttéléchargement de plusieurs images avec libellule

Répondre

10

Préface

Dragonfly lui-même peut être utilisé pour gérer les médias pour votre projet en général, similaire à paperclip . La question elle-même se résume au téléchargement de fichiers multiples dans une application de rails. Les quelques tutoriels disponibles sur ce sujet, qui peuvent facilement être adaptés aux modèles utilisant Dragonfly pour y stocker des fichiers spécifiques. Je vous suggère de regarder dans ceux et d'essayer de les adapter à votre projet.

Cependant, je peux présenter un exemple minimum que j'ai construit pour une application 3.2 rails actuellement en développement, ce qui n'est pas parfait (gestion de validation par exemple), mais peut vous donner quelques points de départ.

Exemple

Juste pour référence, l'idée essentielle est tirée de here. Cet exemple est fait avec Rails 3.2.x. Imaginons que vous ayez une base de données sur les vacances, où les utilisateurs peuvent créer des rapports de voyage sur les vacances qu'ils ont prises. Ils peuvent laisser une petite description, ainsi que quelques images.

Commencez par la construction d'un modèle simple basé ActiveRecord pour les voyages, Appelons juste Trip pour l'instant:

class Trip < ActiveRecord::Base 
    has_many :trip_images 
    attr_accessible :description, :trip_images 
end 

Comme vous pouvez le voir, le modèle a des images de voyage attaché à elle par une association has_many. Permet de jeter un coup d'œil sur le modèle TripImage, qui utilise libellule pour avoir le fichier stocké dans le champ de contenu:

class TripImage < ActiveRecord::Base 
    attr_accessible :content, :trip_id 
    belongs_to :trip_id 

    image_accessor :content 
end 

L'image de voyage elle-même stocke le fichier joint. Vous pouvez placer des restrictions dans ce modèle, par ex. taille du fichier ou type mime.

Créons un TripController qui a une action new et create (vous pouvez générer ce via un échafaudage si vous le souhaitez, il est de loin rien de fantaisie):

class TripController < ApplicationController 
    def new 
     @trip = Trip.new 
    end 

    def create 
     @trip = Trip.new(params[:template]) 

     #create the images from the params 
     unless params[:images].nil? 
      params[:images].each do |image| 
      @trip.trip_images << TripImages.create(:content => image) 
     end 
     if @trip.save 
      [...] 
    end 
end 

Rien de spécial ici, à l'exception de la création les images d'une autre entrée que le hachage params. cela a un sens quand on regarde le champ de téléchargement de fichiers dans le fichier modèle new.html.erb (ou dans la partie que vous utilisez pour les champs du modèle Trip): cependant,

[...] 
<%= f.file_field :trip_images, :name => 'images[]', :multiple => true %> 
[...] 

Cela devrait fonctionner pour le moment, il y a aucune limitation pour les images sur ce droit maintenant.Vous pouvez limiter le nombre d'images sur le côté serveur via un custom validator sur le modèle Trip:

class Trip < ActiveRecord::Base 
    has_many :trip_images 
    attr_accessible :description, :trip_images 
    validate :image_count_in_bounds, :on => :create 

protected 
    def image_count_in_bounds 
     return if trip_images.blank? 
     errors.add("Only 10 images are allowed!") if trip_images.length > 10 
    end 
end 

Je laisse cela à vous, mais vous pouvez également utiliser des validations côté client sur le champ de fichier, l'idée générale serait être de vérifier les fichiers lors de la modification du champ du fichier (en CoffeeScript):

jQuery -> 
    $('#file_field_id').change() -> 
     #disable the form 
     for file in this.files 
      #check each file 
     #enable the form 

Résumé

Vous pouvez construire un grand nombre de tutoriels existants, comme libellule ne se comporte pas différemment à d'autres solutions lorsque il vient à juste pour télécharger des fichiers. Cependant, si vous voulez quelque chose de colombophile, je suggérerais jQuery Fileupload, comme beaucoup d'autres ont avant moi.

En tout cas, j'espère pouvoir vous donner un aperçu.

atterrisseur,

flo

Questions connexes