我很难弄清楚如何防止Paperclip删除旧版本的附件(图片)。
我有一个模型,Site,它有一个附件,logo。我想保留旧徽标,因为我将跟踪模型的变化,并希望查看徽标的历史。
我正在跟踪另一个模型中的更改,该模型具有对文件路径的引用。我的问题是,在使用新徽标更新网站时,Paperclip会先刷新旧徽标。
令我惊讶的是,在创建新附件之前,没有可以切换到防止Paperclip冲洗旧附件的选项。
有什么想法吗?
答案 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附件类似的问题。
有一个补丁可以解决这个问题。我无法让它为自己工作,但它值得一试!
答案 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'