Предотвращение скрепки от удаления/перезаписи вложений при обновлении
Мне сложно определить, как предотвратить удаление Паперклипа старой версии приложения (изображения).
У меня есть модель, сайт, на котором есть вложение, логотип. Я хотел бы сохранить старые логотипы, так как я буду отслеживать изменения в модели и хотел бы просмотреть историю логотипов.
Я отслеживаю изменения в другой модели, которая ссылается на пути к файлам. Моя проблема заключается в том, что при обновлении сайта с новым логотипом, Paperclip сначала очистит старый логотип.
Меня удивляет, что нет возможности переключиться, чтобы предотвратить сглаживание старого скрепления перед созданием нового.
Любые идеи?
Ответы
Ответ 1
Появилась новая опция, которая сообщает папке скреплять старые вложения:
https://github.com/thoughtbot/paperclip/commit/65e8d4f6de50732d8e1b
https://github.com/thoughtbot/paperclip/issues/60
Прост в использовании:
has_attached_file => :attachment,
:styles => { :thumb => 100x100! },
:preserve_files => true
Это еще не задокументировано, и он немного искал, чтобы найти, поэтому я хотел бы поделиться им здесь.
Ответ 2
Поскольку вложения определены на уровне класса, 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 все равно удалит старое вложение из-за кода, вызываемого в Paperclip::Atachment#attach
. Вероятно, лучший способ справиться с этим - создать новый механизм хранения, основанный на Paperclip::Storage::Filesystem
и перезаписать #flush_deletes
. Обратите внимание, что в этом методе нет способа определить, помещен ли файл для удаления из-за того, какая модель принадлежит к его удалению, или новый файл загружается на его место.
Ответ 3
У меня была аналогичная проблема с вложениями Paperclip во время работы над блоком Rails прошлым летом.
Существует патч, который обращается к этому. Я не смог заставить его работать для себя, но это того стоит!
http://github.com/alainravet/paperclip/tree/keep_old_files
Ответ 4
Библиотека/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