扩展 Paperclip

Paperclip 是 Rails 的一个处理 attachment 的插件,相对于以往的 FileColumn 在灵活性和效率上更胜一筹,而且代码也比较好看。这个视频 简单的介绍了 Paperclip 的使用方法。

默认的设置,URL 的占位符中与模型本身相关的只有 id,但是一些情况下,你可能会更希望以其他形式来组织你的附件目录 - 比如以 SKU 来代替数据库记录的 id。这里我们暂不讨论这种做法的好坏,双方面的,好处是目录结构更具有维护性,坏处是万一以后升级数据库,SKU 加个前缀什么的……

Here we go!

使用 paperclip 需要在 model 中调用 has_attached_file 方法,检查文档,有一些简单的使用样例,但是没有我们需要的。通过方法描述我们知道这个方法建立了一个 Paperclip::Attachment 对象,我们继续看文档。对象的方法很少,首先思考:应为我们需要配置的是 attachment 的 url 规则,那么应当是对应整个类而不是单个实例,因此我们只关注 Peperclip::Attachment 的类方法,只有两个。default_options 没有描述,而且展开代码发现并不是我们需要的。

Paperclip::Attchment.interpolation

A hash of procs that are run during the interpolation of a path or
url. A variable of the format :name will be replaced with the return
value of the proc named “:name”. Each lambda takes the attachment and
the current style as arguments. This hash can be added to with your own
proc if necessary.

这正是我们需要的,接下来的扩展就非常方便了:

# app/models/product.rb  

class Product < ActiveRecord::Base  
  has_attached_file :photo,  
    :style => { :thumb => '64x64>' },  
    :url => '/images/products/:to_param.:extension'  
    
  def to_param  
    return self.sku  
  end  
end  
  
# config/initializers/paperclip.rb  

Paperclip::Attachment.interpolations.merge!(  
  :to_param => lambda { |attachment, style| attachment.instance.to_param }  
)

在这里不直接使用 :sku 作为占位符而使用 :to_param 是为了在其他模型中更加的灵活。

Comments

comments powered by Disqus