Предотвращение удаления / перезаписи вложения Paperclip при обновлении - PullRequest
19 голосов
/ 06 февраля 2011

Мне трудно понять, как предотвратить удаление старой версией вложения (изображения) Paperclip.

У меня есть модель, сайт, на котором есть вложение, логотип. Я хотел бы сохранить старые логотипы, так как буду следить за изменениями в модели и хотел бы просматривать историю логотипов.

Я отслеживаю изменения в другой модели, в которой есть ссылки на пути к файлам. Моя проблема в том, что при обновлении сайта новым логотипом Paperclip сначала сбрасывает старый логотип.

Меня удивляет, что нет опции, которую вы можете переключить, чтобы предотвратить скрепку Paperclip от старого вложения перед созданием нового.

Есть идеи?

Ответы [ 4 ]

33 голосов
/ 31 октября 2011

Есть новая опция, которая сообщает скрепке для сохранения старых вложений:

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 голос
/ 06 февраля 2011

Поскольку вложения определены на уровне класса, 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

См. Вики-документация для получения дополнительной информации.

[Обновление]

После некоторого осмотра (см. комментарии к этому ответу) я пришел к выводу, что Скрепка будет все еще удалить старое вложение из-за кода, который вызывается в Paperclip::Atachment#attach.Вероятно, лучший способ справиться с этим - создать новый механизм хранения на основе Paperclip::Storage::Filesystem и перезаписать #flush_deletes.Обратите внимание, что в этом методе нет способа определить, находится ли файл в очереди на удаление из-за модели, к которой он относится, или на его место загружается новый файл.

0 голосов
/ 14 июля 2011

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

0 голосов
/ 06 февраля 2011

У меня была похожая проблема с приложениями Paperclip при работе над блогом Rails прошлым летом.

Существует патч, который решает эту проблему. Я не смог заставить его работать на себя, но это стоит того!

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

...