Мне нужно версии изображений для моего приложения 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
на модели для обновления ее атрибутов. ).