2012-09-30 9 views
6

Używam następujący:Jak ustawić styl Paperclip działa tylko wtedy, gdy contenttype jest obrazem?

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' ] 

Aby przesłać oba obrazy i wideo. Jeśli użyję :style =>{}, obraz nie zostanie przesłany. Chcę użyć metody :style tylko wtedy, gdy typem zawartości pliku jest obraz.

+1

powinieneś używać before_post_process https://github.com/thoughtbot/paperclip#events –

Odpowiedz

5

Można użyć warunku wewnątrz lambda, przepraszam o brzydkim formatowania:

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

Dla '' może is_image' (asset.content_type || "") .split ("/"). first == "image''. Lub po prostu: '/ image \ //. Match (asset.content_type)'. – tokland

+0

To jest dokładnie to, czego szukałem, dzięki! – wbucko

2

Aktualizacja 2016:

Większość upvoted odpowiedź nadal działa, ale trzeba zwrócić pusty hash, jeśli nie jest z spodziewany typ (np. plik PDF, którego nie chcesz przetwarzać zamiast obrazu), w przeciwnym razie wystąpią problemy z numerami TypeError - can't dup NilClass.

próbki za pomocą potrójnego dla lapidarnością, jakiej:

has_attached_file :file, :styles => lambda { |a| a.instance.is_image? ? {:thumbnail => "320x240!"} : {} } 
Powiązane problemy