防止Paperclip在更新时删除/覆盖附件

时间:2011-02-06 02:45:41

标签: ruby-on-rails ruby-on-rails-3 paperclip

我很难弄清楚如何防止Paperclip删除旧版本的附件(图片)。

我有一个模型,Site,它有一个附件,logo。我想保留旧徽标,因为我将跟踪模型的变化,并希望查看徽标的历史。

我正在跟踪另一个模型中的更改,该模型具有对文件路径的引用。我的问题是,在使用新徽标更新网站时,Paperclip会先刷新旧徽标。

令我惊讶的是,在创建新附件之前,没有可以切换到防止Paperclip冲洗旧附件的选项。

有什么想法吗?

4 个答案:

答案 0 :(得分:33)

有一个新选项告诉paperclip保留旧附件:

https://github.com/thoughtbot/paperclip/commit/65e8d4f6de50732d8e1b https://github.com/thoughtbot/paperclip/issues/60

简单易用:

has_attached_file => :attachment,
                     :styles => { :thumb => 100x100! },
                     :preserve_files => true

尚未记录,并进行了一些挖掘,因此我想在此分享。

答案 1 :(得分:1)

因为附件是在类级别定义的,所以Paperclip使用它自己的插值库来插入字符串中的符号。您可以使用此库创建自己的插值。

我会在名为attachment_version的模型中添加一个字段或类似的东西,然后在每次更改文件时增加此版本号。然后,在初始化文件中为它创建插值:

Paperclip.interpolates :version do |attachment, style|
  attachment.instance.attachment_version
end

现在您可以在字符串中使用:version

class Model < ActiveRecord::Base
  has_attached_file :something, :path => " :rails_root/public/somethings/etc/:version.:extension"
end

有关详细信息,请参阅the wiki documentation

<强> [更新]

经过一番挖掘(参见本答案的评论),我得出的结论是,由于Paperclip::Atachment#attach中调用的代码,Paperclip将删除旧附件。处理此问题的最佳方法可能是创建基于Paperclip::Storage::Filesystem的新存储引擎并覆盖#flush_deletes。请注意,该方法无法判断文件是否正在排队等待删除,因为该文件属于要删除的模型或正在上传新文件。

答案 2 :(得分:0)

去年夏天在Rails博客上工作时,我遇到了与Paperclip附件类似的问题。

有一个补丁可以解决这个问题。我无法让它为自己工作,但它值得一试!

http://github.com/alainravet/paperclip/tree/keep_old_files

答案 3 :(得分:0)

LIB / paperclip_monkey_patch.rb:

module Paperclip
  class Attachment
   def clear
    # nop
    #raise "hell"
    # op
    instance_write(:file_name, nil)
    instance_write(:content_type, nil)
    instance_write(:file_size, nil)
    instance_write(:updated_at, nil)
  end
 end
end

然后在删除附件的任何文件的顶部添加此行:

要求'paperclip_monkey_patch'

感谢Ruby Forum