Многие рекомендуют использовать Carrierwave
, и я не исключение, но я хотел бы отметить одну вещь. На многих сайтах, написанных с использованием RoR (очевидно, это не только проблема RoR), я замечаю, что запрос, отправляющий изображение, может быть отложен примерно на 2-3 секунды, а часто даже больше, что связывает экземпляр приложения (что, вероятно, не так уж страшно) если вы используете потоки или не заботитесь о производительности, но это определенно так, если вы используете единорога). Поэтому я объясню, как избежать этого с помощью carrierwave:
1) Выберите фонового работника для своего приложения (я обычно использую Sidekiq)
2) Добавьте carrierwave_backgrounder
в ваш Gemfile и настройте его для работы с вашим фоновым работником и оператором транспортной волны (все в файле readme)
У меня обычно есть контроль над моими каталогами, поэтому я использую опцию store_in_background
, равную carrierwave_backgrounder
, которая обрабатывает и сохраняет изображение в файловой системе или S3 или любом другом используемом вами
3) Теперь, когда вы обновляете изображение, его обработка и сохранение переходят в фоновый режим, что освобождает экземпляр вашего приложения, но занимает некоторое время, в большинстве случаев более 1 секунды, и вам необходимо вернуть какой-то ответ пользователю
4) Самый простой способ предоставить пользователю какой-либо ответ - это вернуть javascript, в котором вы меняете старое изображение на gif с помощью счетчика или чего-то в этом роде, и устанавливаете функцию javascript SetInterval
, которая проверяет, обработано ли изображение (carrierwave_background
предоставляет функцию, которая может изменить логический столбец вашей модели на true, когда она завершит обработку), отправляя запрос AJAX
каждые 2 секунды или по своему усмотрению и изменяя изображение после его обработки.
Теперь у вас есть несвязанный экземпляр приложения и отличный пользовательский интерфейс одновременно.
PS Я новичок в рельсах и веб-разработке как таковой, поэтому в этом руководстве могут быть некоторые предупреждения, которые я пропустил
Надеюсь, это кому-нибудь поможет.
О, и, кстати, есть этот новый драгоценный камень под названием refile
, он потрясающий и в некоторых случаях может быть действительно хорошим вариантом.