PaperTrail плохо работает с Carrierwave и опцией `remove_previcious_stored_files_after_update`

Мне нужно версии изображений для моего приложения Rails. Я использую Carrierwave для загрузки файлов и PaperTrail для управления версиями.

Хотя управление версиями, кажется, работает довольно хорошо, похоже, что уточнение версии не очень хорошо работает с деактивированной remove_previously_stored_files_after_update конфигурацией Carrierwave: в этой ситуации простой reload экземпляра модели больше не работает, только явная свежая загрузка из база данных (с использованием Model.find 123) работает.

Я создал демонстрационное приложение Rails, чтобы продемонстрировать проблему.

Модель User монтирует два загрузчика:

  • AvatarUploader, который удаляет файл после обновления (по умолчанию)
  • KeepingFilesAvatarUploader, который не удаляет файл после обновления, используя параметр remove_previously_stored_files_after_update, установленный на false

Код AvatarUploader:

# encoding: utf-8

class AvatarUploader < CarrierWave::Uploader::Base
  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{model.id}/#{mounted_as}"
  end
end

Код KeepingFilesAvatarUploader:

# encoding: utf-8

class KeepingFilesAvatarUploader < CarrierWave::Uploader::Base
  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{model.id}/#{mounted_as}"
  end

  configure do |config|
    config.remove_previously_stored_files_after_update = false
  end
end

Единственное отличие — опция remove_previously_stored_files_after_update.

Вот код модели User:

class User < ActiveRecord::Base
  has_paper_trail only: [:name, :avatar, :keeping_files_avatar]
  mount_uploader :avatar, AvatarUploader
  mount_uploader :keeping_files_avatar, KeepingFilesAvatarUploader
end

Я написал некоторые спецификации, которые демонстрируют неожиданное поведение. Поскольку они немного длинны для публикации, см. Здесь:

https://github.com/jmuheim/test-carrierwave-papertrail/blob/master/spec/models/user_spec.rb#L20

Все спецификации проходят, кроме той, которую я установил на pending, вот результат:

  1) User versioning reloading the model after reify sets "keeping_files_avatar" to the original value
     # See http://stackoverflow.com/questions/29624223/papertrail-doesnt-play-nice-with-carrierwave-and-remove-previously-stored-file
     Failure/Error: expect(user.keeping_files_avatar.file.filename).to eq 'original-image.jpg' # This upload field isn'! <<<FAILING LINE>>>!

       expected: "original-image.jpg"
            got: "new-image.jpg"

       (compared using ==)
     # ./spec/models/user_spec.rb:20:in `block (4 levels) in <top (required)>'

Finished in 0.20704 seconds (files took 1.51 seconds to load)
4 examples, 0 failures, 1 pending

Было бы очень приятно заставить это работать. Мне не нужна эта функциональность прямо сейчас, но я не хочу добавлять какой-либо технический долг в свой проект (особенно это может привести к очень непредвиденным проблемам, поскольку обычно нужно просто выполнить reload на модели для обновления ее атрибутов. ).


person Joshua Muheim    schedule 14.04.2015    source источник


Ответы (1)


Проверьте, будет ли это работать для вас

class User < ActiveRecord::Base
  has_paper_trail only: [:name, :avatar, :keeping_files_avatar]

  mount_uploader :avatar, AvatarUploader
  mount_uploader :keeping_files_avatar, KeepingFilesAvatarUploader

  skip_callback :save, :after, :remove_previously_stored_keeping_files_avatar
end
person pete007    schedule 24.04.2015
comment
К сожалению: нет, это тоже не так. - person Joshua Muheim; 02.06.2015