У меня есть приложение, использующее Carrierwave для загрузки файлов, но мне очень нравится простота ActiveStorage. Существует множество руководств по переходу с Paperclip на ActiveStorage с предыдущей завершающей разработкой, но я ничего не вижу о переходе с Carrierwave на ActiveStorage. Кто-нибудь успешно выполнил миграцию и может указать мне правильное направление?





Начать с
bundle exec rails active_storage:installrails db:migratemount_uploader :image, ImageUploader, чтобы он выглядел как has_one_attached :image в вашей модели.image_url на url_for(user.image).Вам не нужно вносить какие-либо изменения в код контроллера или в параметры, поскольку атрибут image уже является параметром сильныйсильный>.
# user.rb
class User < ApplicationRecord
# mount_uploader :image, ImageUploader
has_one_attached :image
end
# show.html.erb
<%= image_tag url_for(user.image) %>
or
<%= image_tag user.image %>
Вы храните изображения в облаке, сервисе, таком как s3?
цифровой океан на самом деле, но он использует s3 sdk.
На самом деле процедура действительно проста.
настроить активный сегмент магазина. попробуйте использовать другое ведро, отличное от вашего.
сконфигурируйте вашу модель, чтобы предоставить доступ к ActiveStorage. пример
class Photo < AR::Base
mount_uploader :file, FileUploader # this is the current carrierwave implementation. Don't remove it
has_one_attached :file_new # this will be your new file
end
Теперь у вас будет две реализации одной и той же модели. доступ к несущей на file и ActiveStorage на file_new
загружать изображения из Carrierwave и сохранять их в активном хранилище Это может быть реализовано в файле rake, activeJob и т. д.
Photo.find_each do |photo|
begin
filename = File.basename(URI.parse(photo.fileurl))
photo.file_new.attach(io: open(photo.file.url), filename: d.file )
rescue => e
## log/handle your errors in order to retry later
end
end
На этом этапе у вас будет одно изображение в ведре несущей волны и вновь созданное изображение в активном сегменте хранилища!
Когда вы будете готовы к миграции, измените свою модель, изменив активный аксессуар хранилища, и удалите интеграцию с несущей.
class Photo < AR::Base
has_one_attached :file # we changed the atachment name from file_new to file
end
Это удобный вариант, поэтому ваша интеграция с контроллерами и другими местами останется неизменной. с надеждой!
Обновите свои записи в таблице active_storage_attachments, чтобы вложения находились как file, а не file_new. Обновите столбец name с «file_new» на «file»
Можно внести некоторые другие изменения в приложение, чтобы решить проблемы, которые необходимо учитывать.
что-то вроде этого в помощнике:
photo.attached? ? url_for(photo.file_new) : photo.file.url
Надеюсь, это поможет!
Эта задача с граблями намного проще, чем то, что я начал придумывать, спасибо. Я попробую и расскажу, как все прошло.
возникла проблема с предложенным заданием по рейку. Запуск его как есть дает мне следующее сообщение об ошибке: (неправильный URI (не URI?): nyc3.digitaloceanspaces.com *** / *** / ***. Jpg), хотя я знаю, что изображение есть. Фактически, если я открою указанную ссылку в браузере, у меня появится возможность загрузить ее. Я изменил код, чтобы сначала закодировать uri перед синтаксическим анализом, но затем получил 'undefined method' gsub 'для # <PodcastUploader: ***>', но gsub не используется в загрузчике.
def store_dirif Rails.env.development?"development/#{model.class.to_s.underscore}/#{model.slug.to_s}"else"#{model.class.to_s.underscore}/#{model.slug.to_s}"endendЯ немного любитель и не уверен насчет шага 3. Как мне это запустить? файлы rake и ActiveJobs мне неизвестны. Хорошо, гиды хорошие. Я запустил bin/rails generate job copy-carrierwave-to-activestorage. Я думаю, что могу работать с вашим Photo.find…, но для меня не очевидно, в какой файл его вставить и как его запустить, когда я это сделаю. Это файлы app/jobs/copy_carrierwave_to_activestorage_job.rb, spec/jobs/copy_carrierwave_to_activestorage_job_spec.rb и app/jobs/application_job.rb. Я ценю этот пост, потому что больше ничего не вижу при переносе.
Вы действительно пробовали свой код? Строка attach () в моем эквиваленте вашего шага № 3 photo.file_new.attach() вылетает с ошибкой: NoMethodError (undefined method 'upload' for nil:NilClass). Кажется, проблема в том, что большой двоичный объект не подписывается? Если у кого-то есть рабочее решение, поделитесь пожалуйста.
Спасибо за ответ. Определенно полезно для начальной настройки, которую я уже сделал, но я хотел перенести существующие записи из Carrierwave в ActiveStorage.