如何设置Paperclip样式仅在内容类型为图片时生效?

7

我正在使用以下内容:

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

要同时上传图像和视频。如果我使用:style => {},那么图像就不会被上传。我只想在文件的内容类型为图像时使用:style方法。

1
你应该使用 before_post_process 事件。https://github.com/thoughtbot/paperclip#events - Dmitry Z.
2个回答

6

您可以在lambda内部使用条件,对于丑陋的格式化表示歉意:

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

对于 is_image 可以使用 (asset.content_type || "").split("/").first == 'image'。或者简单地使用 /image\//.match(asset.content_type) - tokland

3

更新 2016:

最受欢迎的回答仍然有效,但是如果它不是预期类型(例如您不想处理的PDF而不是图像),则需要返回一个空哈希,否则您将遇到 TypeError - can't dup NilClass 问题。

使用三元运算符进行简洁示例:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接