Загрузка изображений 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 & множество ресурсов доступны везде