2011-02-06 49 views
19

我有一個很難搞清楚如何防止回形針從刪除舊版本的附件(圖像)的覆蓋附件防止回形針。從刪除/上更新

我有一個模型,網站,裏面有一個附件,標誌。我希望保留舊標識,因爲我將跟蹤模型的變化並希望查看徽標的歷史記錄。

我追蹤的另一種模式,它具有文件路徑參考的變化。我的問題是,使用新徽標更新網站時,Paperclip會先刷新舊徽標。

我很驚訝有沒有可以切換到防止回形針從沖洗在創建新的以前的老附件的選項。

任何想法?

回答

32

有一個新的選擇,告訴回形針:

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 

然後在該刪除附件的任何文件的頂部添加此行保留舊附件:

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

因爲附件是在類級別定義,回形針使用它自己的內插插圖書館在你的字符串的符號。您可以使用此庫創建自己的插值。

我會一個字段添加到一個名爲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::Storage::Filesystem的新存儲引擎並覆蓋#flush_deletes。請注意,該方法無法判斷某個文件是否正在排隊刪除,原因是該文件屬於被刪除的模型或正在上載新文件。

+0

即使名稱不匹配,回形針仍然會刪除舊文件,只是默認情況下... – 2011-02-06 03:41:04

+1

這似乎是這種情況。 `Paperclip :: Attachment#assign`調用`#clear`,它調用`queue_existing_for_delete`,這反過來又做到了它聽起來的那樣。您*可以*根據https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/storage/filesystem.rb創建新的存儲引擎,並根據需要修改`#flush_deletes`。 – 2011-02-06 03:59:32

0

lib/paperclip_monkey_patch。RB:

需要「paperclip_monkey_patch」

由於Ruby Forum