2010-05-27 6 views
8

J'utilise paperclip pour télécharger toutes sortes de fichiers (documents texte, binaires, images).Styles dans Paperclip seulement si c'est une image [rails]

Je voudrais mettre dans mon modèle:

has_attached_file :attachment, :styles => { :medium => "300x300>", :thumb => "100x100>" } 

mais il doit effectuer les styles seulement si elle est une image. J'ai essayé d'ajouter

if :attachment_content_type =~ /^image/ 

mais cela n'a pas fonctionné.

Répondre

15

Vous pouvez utiliser le rappel before_<attachment>_post_process pour arrêter la génération de vignettes pour les non-images. Si vous renvoyez false dans le rappel, aucune tentative d'utilisation des styles ne sera effectuée.

Voir "Événements" section docs

before_attachment_post_process :allow_only_images 

    def allow_only_images 
    if !(attachment.content_type =~ %r{^(image|(x-)?application)/(x-png|pjpeg|jpeg|jpg|png|gif)$}) 
     return false 
    end 
    end 
3

peut être vous besoin de quelque chose comme ceci:

:styles => lambda { |attachment| 
    !attachment.instance.image? ? {} : {:thumb => "80x24", :preview => "800x600>"} 
} 

et définir la méthode dans votre modèle:

def image? 
    attachment.content_type.index("image/") == 0 
end 
1

Vous pouvez utiliser sur votre modèle

`has_attached_file :avatar, 
     :styles => lambda { |a| if a.content_type =~ %r{^(image|(x-)?application)/(x-png|pjpeg|jpeg|jpg|png|gif)$} 
          { 
          :thumb => "100x100#", 
          :medium => "300x300>", 

          } 
         else 
          Hash.new 
         end 
         },:default_url => "/missing.png"`