如何使用单个回形针字段来处理不同的文件类型。例如,我有一个带有回形针方法的文件模型,上面写着:
has_attached_file :file
此文件可以是图片,音频,视频或文档。
如果是图片,我怎样才能使has_attached_file :file
能够以这种方式处理图片:
has_attached_file :file, styles: {thumb: "72x72#"}
然后,如果它是其他文档类型,它将在没有样式的情况下正常工作,因此我不必为不同的文件类型创建字段。
答案 0 :(得分:6)
您处理条件样式的方式是使用lambda
来确定您要处理的内容类型。我们之前使用早期版本的Rails / Paperclip完成了这项工作:
#app/models/attachment.rb
Class Attachment < ActiveRecord::Base
has_attached_file :file,
styles: lambda { |a| a.instance.is_image? ? {:small => "x200>", :medium => "x300>", :large => "x400>"} : {}}
validates_attachment_content_type :file, :content_type => [/\Aimage\/.*\Z/, /\Avideo\/.*\Z/]
private
def is_image?
attachment.instance.attachment_content_type =~ %r(image)
end
end
答案 1 :(得分:4)
感谢Rich Peck的回答,我能用这个解决方案来解决我的问题。
首先使用lambda来处理条件
has_attached_file :file,
styles: lambda { |a| a.instance.check_file_type}
然后我定义了一个名为check_file_type
在这种方法中,我根据ruby best pratice article
进行了验证并轻松检查def check_file_type
if is_image_type?
{:small => "x200>", :medium => "x300>", :large => "x400>"}
elsif is_video_type?
{
:thumb => { :geometry => "100x100#", :format => 'jpg', :time => 10, :processors => [:ffmpeg] },
:medium => {:geometry => "250x150#", :format => 'jpg', :time => 10, :processors => [:ffmpeg]}
}
else
{}
end
end
并定义了我的is_image_type?
和is_video_type?
来处理视频和图片。
def is_image_type?
file_content_type =~ %r(image)
end
def is_video_type?
file_content_type =~ %r(video)
end
然后我的附件验证现在看起来像这样
validates_attachment_content_type :file, :content_type => [/\Aimage\/.*\Z/, /\Avideo\/.*\Z/, /\Aaudio\/.*\Z/, /\Aapplication\/.*\Z/]
使用这种方法,我现在可以使用一个回形针方法来处理多种文件类型。