paperclip是一个不错的上传控件。尺寸、路径等在model中简单配置即可。
下面看一个简单的配置:
has_attached_file :cover, :styles => { :medium => "130x95>", :small => "70x70>" }, :path => ":rails_root/public/uploads/:class/:attachment/:id/:style/album_cover.:extension", :url => "/uploads/:class/:attachment/:id/:style/album_cover.:extension", :default_url => "/uploads/:class/:attachment/:style/photo_album_thumb.jpg"
类似:class、:attachment、:id、:style,这些都会自动取到相应的值进行填充。
接下来,看一下这些在paperclip中是如何实现的。
def self.interpolations @interpolations ||= { :rails_root => lambda{|attachment,style| RAILS_ROOT }, :rails_env => lambda{|attachment,style| RAILS_ENV }, :class => lambda do |attachment,style| attachment.instance.class.name.underscore.pluralize end, :basename => lambda do |attachment,style| Iconv.iconv("GB2312", "UTF-8", attachment.original_filename.gsub(/#{File.extname(attachment.original_filename)}$/, "")) end, :extension => lambda do |attachment,style| ((style = attachment.styles[style]) && style[:format]) || File.extname(attachment.original_filename).gsub(/^\.+/, "") end, :id => lambda{|attachment,style| attachment.instance.id }, :id_partition => lambda do |attachment, style| ("%09d" % attachment.instance.id).scan(/\d{3}/).join("/") end, :attachment => lambda{|attachment,style| attachment.name.to_s.downcase.pluralize }, :style => lambda{|attachment,style| style || attachment.default_style }, } end
这里面的占位符都是paperclip自带的。
那么,在model中指定路径时,我们想加入一些自定义的占位符,那该怎么办呢?
例如,我们想在路径中加入当天日期。
model中可以这样来配置:
has_attached_file :cover, :styles => { :medium => "130x95>", :small => "70x70>" }, :path => ":rails_root/public/uploads/:class/:today/:attachment/:id/:style/album_cover.:extension", :url => "/uploads/:class/:today/:attachment/:id/:style/album_cover.:extension", :default_url => "/uploads/:class/:attachment/:style/photo_album_thumb.jpg"
在这个路径中,:today占位符paperclip是不会识别的,所以,我们也得加一个关于:today占位符的实现。
最简单的方法是直接改paperclip中interpolations方法的@interpolations变量,在其中加入以下代码:
:today => proc do Time.now.strftime("%Y%m%d") end
最后,重启服务即可。
不过,不建议这么做。
我们可以在控制器中或者其他地方加入以下这段来实现同样的功能:
Paperclip::Attachment.interpolations[:today] = proc do Time.now.strftime("%Y%m%d") end
如果想在路径中加入自定义的其他占位符,原理和这个类似,只需要修改自定义占位符的实现即可。