Миграция Carrierwave в ActiveStorage

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
2 910
2

Ответы 2

Начать с

  1. Вам нужно будет запустить этот bundle exec rails active_storage:install
  2. rails db:migrate
  3. Замените mount_uploader :image, ImageUploader, чтобы он выглядел как has_one_attached :image в вашей модели.
  4. Для рендеринга изображения в представлении следует заменить 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 %>

Спасибо за ответ. Определенно полезно для начальной настройки, которую я уже сделал, но я хотел перенести существующие записи из Carrierwave в ActiveStorage.

user3141095 27.09.2018 23:00

Вы храните изображения в облаке, сервисе, таком как s3?

Kedarnag Mukanahallipatna 28.09.2018 04:43

цифровой океан на самом деле, но он использует s3 sdk.

user3141095 29.09.2018 01:46

На самом деле процедура действительно проста.

шаг 1:

настроить активный сегмент магазина. попробуйте использовать другое ведро, отличное от вашего.

шаг 2:

сконфигурируйте вашу модель, чтобы предоставить доступ к 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

шаг 3:

загружать изображения из 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

На этом этапе у вас будет одно изображение в ведре несущей волны и вновь созданное изображение в активном сегменте хранилища!

(по желанию)

шаг 4

Когда вы будете готовы к миграции, измените свою модель, изменив активный аксессуар хранилища, и удалите интеграцию с несущей.

 class Photo < AR::Base
   has_one_attached :file # we changed the atachment name from file_new to file 
 end

Это удобный вариант, поэтому ваша интеграция с контроллерами и другими местами останется неизменной. с надеждой!

шаг 5

Обновите свои записи в таблице active_storage_attachments, чтобы вложения находились как file, а не file_new. Обновите столбец name с «file_new» на «file»

Примечания

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

  • если ваш сайт будет работать, пока вы выполняете миграцию, одним из способов полноценной работы будет реализация активного хранилища для новых загрузок, тогда при отображении изображений вы можете отобразить активное хранилище и несущую волну в качестве запасного варианта.

что-то вроде этого в помощнике:

photo.attached? ? url_for(photo.file_new) : photo.file.url

Надеюсь, это поможет!

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

user3141095 02.10.2018 14:42

возникла проблема с предложенным заданием по рейку. Запуск его как есть дает мне следующее сообщение об ошибке: (неправильный URI (не URI?): nyc3.digitaloceanspaces.com *** / *** / ***. Jpg), хотя я знаю, что изображение есть. Фактически, если я открою указанную ссылку в браузере, у меня появится возможность загрузить ее. Я изменил код, чтобы сначала закодировать uri перед синтаксическим анализом, но затем получил 'undefined method' gsub 'для # <PodcastUploader: ***>', но gsub не используется в загрузчике.

user3141095 02.10.2018 23:55
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
user3141095 02.10.2018 23:58

Я немного любитель и не уверен насчет шага 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. Я ценю этот пост, потому что больше ничего не вижу при переносе.

Greg 16.05.2019 00:37

Вы действительно пробовали свой код? Строка attach () в моем эквиваленте вашего шага № 3 photo.file_new.attach() вылетает с ошибкой: NoMethodError (undefined method 'upload' for nil:NilClass). Кажется, проблема в том, что большой двоичный объект не подписывается? Если у кого-то есть рабочее решение, поделитесь пожалуйста.

Arta 14.08.2019 19:49

Другие вопросы по теме