2011-10-03 10 views
7

stavo provando per il caricamento di più immagini con dragonfly in rails3. ho cercato alcuni tutorial, ma non ho trovato nessuno. ho trovato un tutorial per più caricamento delle immagini con Carrierwave, ma couldnt trovare fortuna con libellula .. qualsiasi aiuto per favore :)caricamento di più immagini con la libellula

risposta

10

Prefazione

Dragonfly stesso può essere utilizzato per gestire i supporti per il progetto in generale, simile a paperclip . La domanda in sé si riduce al caricamento di più file all'interno di un'applicazione di rotaie. Sono disponibili alcuni tutorial su questo argomento, che possono essere facilmente adattati ai modelli che utilizzano Dragonfly per archiviare su di essi file specifici. Ti suggerirei di esaminarli e provare ad adattarli al tuo progetto.

Tuttavia, posso presentare un esempio minimo che ho creato per un'applicazione di rails 3.2 attualmente in sviluppo, che non è perfetta (gestione della convalida, ad esempio), ma può darti dei punti di partenza.

Esempio

Solo per riferimento, l'idea essenziale è tratto dal here. Questo esempio è fatto con Rails 3.2.x.

Supponiamo che tu disponga di un database per le vacanze, dove gli utenti possono creare rapporti di viaggio sulle vacanze che hanno scattato. Possono lasciare una piccola descrizione, così come alcune immagini.

iniziare con la costruzione di un semplice modello basato ActiveRecord per i viaggi, consente solo chiamare Trip per ora:

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

Come si può vedere, il modello ha le immagini viaggio collegato ad esso tramite un'associazione has_many. Diamo un rapido sguardo al modello TripImage, che utilizza libellula per avere il file memorizzato nel campo dei contenuti:

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

    image_accessor :content 
end 

L'immagine viaggio è di per sé memorizza il file allegato. Puoi posizionare qualsiasi restrizione all'interno di questo modello, ad es. dimensione del file o tipo mime.

Creiamo un TripController, che ha un'azione new e create (è possibile generare questo tramite ponteggi se si vuole, è di gran lunga niente di speciale):

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 

Niente di speciale qui, con l'eccezione di creare le immagini da un'altra voce rispetto all'hash params. questo ha senso quando guardando il campo di caricamento file all'interno del file modello new.html.erb (o nel parziale, che si utilizza per i campi sul modello Trip):

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

Questo dovrebbe funzionare per il momento, tuttavia, ci sono senza limitazioni per le immagini su questo adesso.È possibile limitare il numero di immagini sul lato server tramite un custom validator sul modello 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 

lascio questo a voi, ma si potrebbe anche usare convalide lato client sul campo di file, l'idea generale sarebbe essere quello di controllare i file su di cambiare il campo del file (in CoffeeScript):

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

Sommario

Si può costruire un sacco di tutorial già esistenti, come la libellula non si comporta in modo diverso che ad altre soluzioni quando si tratta di solo per caricare file. Tuttavia, se desideri qualcosa di più elaborato, suggerirei jQuery Fileupload, come molti altri hanno prima di me.

In ogni caso, spero di poter fornire qualche intuizione.

lg,

flo

Problemi correlati