自定义paperclip的上传路径

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

 

如果想在路径中加入自定义的其他占位符,原理和这个类似,只需要修改自定义占位符的实现即可。

你可能感兴趣的:(Rails)