Загрузка изображений Ruby on Rails
Я новичок в rails так жаль, если это легко. Мне интересно, как лучше загружать фотографии и отображать их в Ruby on Rails. У меня есть блог и я хотел бы иметь возможность прикреплять изображение при создании сообщения.
8 ответов
Скрепка довольно удивительная. Есть отличный RailsCast о нем - http://railscasts.com/episodes/134-paperclip
CarrierWave-это более новый камень, чем скрепка, и он выглядит намного более гибким. Об этом также есть Railscast:http://railscasts.com/episodes/253-carrierwave-file-uploads
предполагая, что вам не нужны причудливые функции, не хотите добавлять зависимость и хотите сохранить изображение в виде BLOB в вашей БД, вы можете сделать что-то вроде:
модель:
class Image < ActiveRecord::Base
def img=(input_data)
self.filename = input_data.original_filename
self.filetype = input_data.content_type.chomp
self.img = input_data.read
end
end
:
class ImagesController < ApplicationController
def display_img
@img = Image.find(params[:id])
send_data(@img.img, :type => @img.filetype, :filename => @img.filename,
:disposition => 'inline')
end
end
вот ссылка к более полному учебнику.
многие рекомендуют использовать Carrierwave
и я не исключение, но я хотел бы отметить одну вещь. На многих сайтах, написанных с помощью RoR (это, очевидно, не только проблема RoR), я замечаю, что запрос, отправляющий изображение, может быть отложен на 2-3 секунды и часто даже больше, что связывает экземпляр приложения (что, вероятно, не так страшно, если вы используете потоки или не заботитесь о производительности, но это определенно так, если вы используете unicorn). Поэтому я объясню, как избежать что с помощью carrierwave:
1) Выберите фонового работника для вашего приложения (я обычно иду с Sidekiq)
2) Добавить carrierwave_backgrounder
в ваш Gemfile и настроить его для работы с фоновым работником и carrierwave (все в его readme)
у меня обычно есть контроль над моими каталогами, поэтому я иду с на carrierwave_backgrounder
который обрабатывает и сохраняет изображение в файловой системе или S3 или что вы используете
3) Теперь, когда вы обновите изображение, его обработка и хранение идет в фоновом режиме, что освобождает ваш экземпляр приложения, но это занимает некоторое время, в большинстве случаев более 1 секунды, и вам нужно вернуть некоторый ответ пользователю
4) Самый простой способ предоставить пользователю какой-либо ответ-вернуть javascript, в котором вы меняете старую картинку на gif со спиннером или что-то в этом роде и устанавливаете javascript SetInterval
функция, которая проверяет, было ли изображение обработано (carrierwave_background
предоставляет функцию, которая может изменить логический столбец вашей модели на true, когда она закончит обработку) отправка AJAX
запрос каждые 2 секунды или что вы предпочитаете и изменение изображения, когда он был обработан.
теперь у вас есть развязанный экземпляр приложения и прекрасный пользовательский опыт в то же время.
PS Я новичок в rails и веб-разработке как таковой, поэтому в этом руководстве могут быть некоторые оговорки, которые я пропустил
надеюсь, это поможет кому-нибудь.
О, и кстати, есть новый камень под названием refile
, это удивительно, и может быть действительно хорошим вариантом в некоторых случаях.
многие рекомендуют скрепки. Возможно, вы хотите попробовать использовать в первую очередь.
CarrierWave, вероятно, лучшее решение для загрузки изображений в Rails. В следующем сообщении описывается решение для загрузки изображений с помощью CarrierWave, в то время как преобразования изображений выполняются плавно в облаке. Загруженные изображения хранятся в облаке и доставляются через CDN. Нет необходимости устанавливать RMagick, MiniMagick и ImageMagick. http://cloudinary.com/blog/ruby_on_rails_image_uploads_with_carrierwave_and_cloudinary
attachment_fu (http://github.com/technoweenie/attachment_fu
) есть еще один вариант, хотя я лично рекомендовал бы скрепки. Он не требует Rmagick, что является большим плюсом, и он поддерживает некоторые интересные функции, такие как загрузки в S3 с незначительной конфигурацией.
сентября 2018
для тех, кто недавно проверял этот вопрос,Rails 5.2 + теперь имеет ActiveStorage по умолчанию, и я настоятельно рекомендую проверить его.
поскольку он является частью основных рельсов 5.2+ теперь, он очень хорошо интегрирован и имеет отличные возможности из коробки (все еще все другие известные драгоценные камни, такие как Carrierwave, Shrine, paperclip,... велики, но этот предлагает очень хорошие функции, которые мы можем рассмотреть для любых новых рельсов проект)
команда скрепки устарела драгоценный камень в пользу Rails ActiveStorage.
вот страница github для ActiveStorage & множество ресурсов доступны везде