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

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

我有一个模型,网站,有一个附件,标志。 我想保留旧徽标,因为我将跟踪模型的更改并希望查看徽标的历史记录。

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

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

有任何想法吗?

有一个新选项告诉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 

它尚未记录,并进行了一些挖掘,所以我想在这里分享。

由于附件是在类级别定义的,因此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 

有关更多信息,请参阅Wiki文档 。

[更新]

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

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

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

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

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论坛