Подтвердить что ты не робот

Предотвращение скрепки от удаления/перезаписи вложений при обновлении

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

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

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

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

Любые идеи?

4b9b3361

Ответ 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