2011-05-03 15 views
7

En la aplicación de mi Rails, me gustaría permitir a los usuarios cargar archivos de imagen o sin imagen a través de Carrierwave. Actualmente Carrierwave está trabajando bien manejando y procesando archivos de imágenes, pero desafortunadamente está eliminando archivos que no son imágenes por completo. ¿Existe una forma clara para que una sola carga de Carrierwave pueda procesar archivos tanto de imagen como de otra?Con Carrierwave and Rails 3, ¿es posible administrar fácilmente archivos de imagen y sin imagen con el mismo cargador?

Voy a incluir mi cargador de corriente por debajo de:

class AssetUploader < CarrierWave::Uploader::Base 

    include CarrierWave::MiniMagick 

    storage :file 

    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 

    version :thumb do 
    process :resize_to_fill => [300, 300] 
    end 

    version :icon do 
    process :resize_to_fill => [48, 48] 
    end 

    def extension_white_list 
    %w(jpg jpeg gif png pdf doc xls docx xlsx ppt) 
    end 

end 
+2

No he utilizado CarrierWave joya, pero con Paperclip esto es bastante trivial. Mirando el archivo Léame de CW, su uso parece mucho más complicado que usar Paperclip, también. Solo mi $ .02 – Yardboy

+2

Tienes razón. De hecho, terminé cambiando a Paperclip, heh. – jklina

Respuesta

2

Tenía este problema exacto. Lo resolví con la antigua solución de ciencia ficción de un nivel más de indirección: un método de trampolín/thunk que decide dinámicamente si se procesa según la extensión del archivo.

Puede encontrar la aplicación aquí: https://gist.github.com/995663

(el enfoque ingenuo de la introducción de la lógica en el bloque de la versión en realidad no funciona debido a cómo funciona el CarrierWave DSL - la lógica tiene que ser aplazado hasta la invocación)

Espero que eso ayude.

+0

Es un comienzo, pero incompleto, ya que aún crea las versiones. El procesamiento no ocurre, pero terminarás con múltiples copias del archivo original. – keithepley

1

Sé que esto ha sido respondido, pero la respuesta de Aaron no resuelve completamente el problema. Puede usar lo que sugirió en https://gist.github.com/995663 si solo necesita llamar al process, pero no si desea procesar selectivamente con version.

Para la versión, consulte la página wiki carrierwave aquí: https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Do-conditional-processing

Ahora puede hacer esto en su código, y sólo procesará el bloque de la versión en imágenes

version :thumb, :if => :image? do 
    process ... 
end 

protected 

def image?(new_file) 
    new_file.content_type.include? 'image' 
end 
Cuestiones relacionadas