论坛首页 编程语言技术论坛

扩展 Paperclip

浏览 3380 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-01-23   最后修改:2009-01-23

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 是为了在其他模型中更加的灵活。

 

   发表时间:2009-01-23  
看不出这里为什么用一个to_param方法给其他模型,因为在Product中使用has_attached_file后,就是说这个模型有了可以attach file的能力,它不会共享给其他模型。。。不过to_params比sku更加reasonable,但是没有必要。
0 请登录后投票
   发表时间:2009-01-24  
当然不是要共享给其他。因为扩展的是 Paperclip::Attachment 这个类,如果另外一个类 has_attached_file 也需要类似的功能,再添加一种占位符显然不是很好的方法,SKU 对新的类来说没有什么意义。而 to_param 方法本身就有这样的意义,更合理一点
0 请登录后投票
   发表时间:2009-01-28  
hozaka 写道
当然不是要共享给其他。因为扩展的是 Paperclip::Attachment 这个类,如果另外一个类 has_attached_file 也需要类似的功能,再添加一种占位符显然不是很好的方法,SKU 对新的类来说没有什么意义。而 to_param 方法本身就有这样的意义,更合理一点


还是对你的做法很费解。

就算在另外一个类中声明has_attached_file,那关现在这个model什么事,你还是要另外定义一个url/path,它也不会知道之前定义的url。

前段时间在一个项目中用paperclip替换了attachment_fu,其中使用了right_aws这个性能不错的gem来连接amazon。
0 请登录后投票
   发表时间:2009-02-01  
chenk85 写道

还是对你的做法很费解。

就算在另外一个类中声明has_attached_file,那关现在这个model什么事,你还是要另外定义一个url/path,它也不会知道之前定义的url。


所以扩展 to_params 而不是其他的
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics