2016-11-13 4 views
0

Я только что обнаружил, что у Heroku нет долговременного хранилища файлов, поэтому мне нужно перейти к использованию S3 или аналогичного. Множество новых бит и частей, чтобы опустить голову, я понял, как прямая загрузка на S3 с использованием CarrierWave-direct, а затем обработка delayed_job должна работать с моим Rails-приложением?Rails, хранилище Amazon S3, CarrierWave-Direct и delayed_job - это правильно?

То, что я думаю, что должно произойти, если я правильно закодировать это следующее:

  1. Я подписаться на S3 счет, установленный мое ведро (ы) и получить данные аутентификации и т.д., что мне нужно будет программировать (соответственно скрыты от моих пользователей)
  2. Я убеждаюсь, что прямая загрузка белые списки не остановить междоменного от предотвращения мои добавления (и позже загрузки)
  3. я использую CarrierWave & CarrierWave-direct (или аналогичный), чтобы создайте мои загрузки, чтобы не загружать мое приложение во время загрузки
  4. S3 создаст информацию с произвольным доступом ('filename'), поэтому мне не нужно беспокоиться о том, что несколько пользователей загружают файлы с тем же именем и файлы, которые будут перезаписаны; если меня интересуют исходные имена, я могу использовать метаданные для их хранения.
  5. CarrierWave-direct перенаправляет браузер пользователя на «загруженный завершенный» URL после загрузки с того места, где я могу либо создать delayed_job, либо всплывающее уведомление «извините, это пошло не так».
  6. На этом этапе пользователь знает, что задание будет предпринято, и они перейдут к другому материалу.
  7. My delayed_job task обращается к файлу с помощью S3 API и может удалить входной файл по завершении.
  8. delayed_job завершает и уведомляет пользователя обычным способом, например. электронное письмо.

Это или я что-то не хватает? Благодарю.

ответ

0

У вас есть хорошее понимание процесса, в котором вы нуждаетесь. Чтобы сбросить на вас еще один уровень сложности - вы должны обернуть все это в rails new (er) ActiveJob. ActiveJob просто обрабатывает фоновые изображения внутри рельсов через процессор по вашему выбору (в вашем случае DelayedJobs). Затем, вы можете создать рабочие места с помощью генератора рельсов:

bin/rails g job process_this_thing 

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

Итак, вы создаете загрузчик с несущей (см. Документы несущей). Затем присоедините этот загрузчик к модели. Для carrierwave_direct вам необходимо отключить поле файла из формы модели и переместить поле файла в свою собственную форму (используйте метод url формы, предоставляемый функцией carrierwave-direct).

Вы можете загрузить файл, а затем сохранить запись. Или сохраните запись, а затем обработайте файл. Процесс настройки значительно отличается в зависимости от выбранного вами варианта.

Carrierwave и carrierwave-direct знают, где сохранить файл на основе учетных данных тумана, которые вы помещаете в инициализатор несущей, и используя путь store_dir, если он установлен, в загрузчике.

Carrierwave предоставляет загрузчик, который определяет версии и т. Д. Функции Carrierwave_direct загружают прямо в ваш ведро S3 и обрабатывают версии в фоновом режиме.Active Jobs, через DelayedJobs, обеспечивает фоновую обработку. Туман - это связь между несущей и вашим ковшом S3.

Вы должны добавить булевский флаг в свою модель, для которого установлено значение true, когда carrierwave_direct загружает ваше изображение, а затем устанавливается значение false, когда работа заканчивается обработкой версий. Таким образом, вместо сломанной ссылки (пока работа выполняется и еще не завершена) ваше представление будет показывать что-то вроде «эта вещь все еще обрабатывается ...».

RailsCast - идеальный ресурс для выполнения этой задачи. Проверьте это: https://www.youtube.com/watch?v=5MJ55_bu_jM