2012-09-30 10 views
6

Estoy utilizando el siguiente:¿Cómo establecer el estilo Paperclip solo si contenttype es imagen?

has_attached_file :file,:styles => { :thumbnail => '320x240!'},:url => "/images/:attachment/:id/:style/:basename.:extension",:path => ":rails_root/public/images/:attachment/:id/:style/:basename.:extension" 

validates_attachment_content_type :file, :content_type => [ 'image/gif', 'image/png', 'image/x-png', 'image/jpeg', 'image/pjpeg', 'image/jpg' ] 

Para cargar las imágenes y de vídeo. Si uso :style =>{}, la imagen no se carga. Deseo utilizar el método :style solo si el tipo de contenido del archivo es imagen.

+1

que puedes usar before_post_process https://github.com/thoughtbot/paperclip#events –

Respuesta

5

Puede utilizar condiciones en el interior de la lambda, lo de fea formato:

has_attached_file :file, :styles => lambda 
{ |a| 
     if a.instance.is_image? 
     {:thumbnail => "320x240!"} 
     end 
} 


def is_image? 
    return false unless asset.content_type 
    ['image/jpeg', 'image/pjpeg', 'image/gif', 'image/png', 'image/x-png', 'image/jpg'].include?(asset.content_type) 
end 
+0

Por '' tal vez is_image' (asset.content_type || "") .split ("/"). first == 'image''. O simplemente: '/ image \ //. Match (asset.content_type)'. – tokland

+0

Esto es exactamente lo que estaba buscando, ¡gracias! – wbucko

2

Actualización 2016:

respuesta más upvoted todavía funciona, pero tiene que devolver un hash vacía si no es de la tipo esperado (por ejemplo, un PDF que no desea procesar en lugar de una imagen); de lo contrario, se encontrará con los problemas TypeError - can't dup NilClass.

muestra utilizando un ternaria de concisión:

has_attached_file :file, :styles => lambda { |a| a.instance.is_image? ? {:thumbnail => "320x240!"} : {} } 
Cuestiones relacionadas