2015-06-07 17 views
9

Ho il seguente come il mio FileUploader:upload di file Carrierwave con diversi tipi di file

class FileUploader < CarrierWave::Uploader::Base 
    include CarrierWave::MiniMagick 

    version :thumb, if: :image? do 
    # For images, do stuff here 
    end 

    version :preview, if: :pdf? do 
    # For pdf, do stuff here 
    end 

    protected 

    def image?(new_file) 
    new_file.content_type.start_with? 'image' 
    end 

    def pdf?(new_file) 
    new_file.content_type.start_with? 'application' 
    end 

end 

ho ottenuto questo dalla pagina carrierwave github. Funziona principalmente, ma cosa succede se non voglio versioni differenti? Fondamentalmente voglio solo fare determinati processi se si tratta di un pdf o di determinati processi se si tratta di un'immagine. Potrei consentire anche altri tipi di file in futuro, quindi sarebbe bello se potessi avere un modo semplice per farlo.

Per un esempio, mi può essere utile utilizzare un imgoptim se si tratta di un'immagine, e poi un pdf ottimizzazione biblioteca se si tratta di un file PDF, ecc

ho provato:

if file.content_type = "application/pdf" 
    # Do pdf things 
elsif file.content_type.start_with? 'image' 
    # Do image things 
end 

ma ottenere il errore: NameError: (undefined local variable or method file 'per FileUploader: Class`

+0

Questo stato di risposta non è in realtà un errore interno del server 500, il che probabilmente significa che potrebbe essere morto da qualche parte quando si prova a richiedere il controller. Puoi anche pubblicare il tuo modello e controller? – Edward

risposta

7

Si dovrebbe provare a utilizzare in questo modo

class FileUploader < CarrierWave::Uploader::Base 
    include CarrierWave::MiniMagick 

    process :process_image, if: :image? 
    process :process_pdf, if: :pdf? 

    protected 

    def image?(new_file) 
    new_file.content_type.start_with? 'image' 
    end 

    def pdf?(new_file) 
    new_file.content_type.start_with? 'application' 
    end 

    def process_image 
    # I process image here 
    end 

    def process_pdf 
    # I process pdf here 
    end 
end 
3

L'eccezione indica che si sta chiamando una variabile di istanza a livello di classe. Aggiungi un breakpoint del debugger e stampa autonomamente capirai cosa sta succedendo.

Soluzione a questo è per avvolgere la logica in un metodo di istanza e utilizzare questo metodo come processo predefinito.

process :process_file 

def process_file 
    if file.content_type = "application/pdf" 
     # Do pdf things 
    elsif file.content_type.start_with? 'image' 
     # Do image things 
    end 
end 

In questo modo, si può sbarazzarsi di versioni non è necessario, e il processo di tutto ciò che si desidera in base a tipi MIME.