Загрузка изображений Ruby on Rails

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


person bgadoci    schedule 07.12.2009    source источник


Ответы (8)


Скрепка довольно классная. Об этом есть отличный RailsCast - http://railscasts.com/episodes/134-paperclip

person danpickett    schedule 07.12.2009
comment
После этого ответа скрепка устарела в пользу активного хранилища. - person BKSpurgeon; 25.08.2018

CarrierWave - это более новая жемчужина, чем Paperclip, и она выглядит намного более гибкой. Также есть Railscast об этом: http://railscasts.com/episodes/253-carrierwave-file-uploads

person Felipe Cerda    schedule 08.12.2011

Предполагая, что вам не нужны необычные функции, вы не хотите добавлять зависимость и хотите сохранить изображение как 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

Вот ссылка на более полное руководство.

person JRL    schedule 07.12.2009
comment
Избегайте хранения больших двоичных объектов в базе данных - это редко бывает хорошей идеей. - person bensie; 07.12.2009

Многие рекомендуют использовать Carrierwave, и я не исключение, но хочу отметить одну вещь. На многих сайтах, написанных с использованием RoR (это, очевидно, не только проблема RoR), я замечаю, что запрос, отправляющий изображение, может быть отложен примерно на 2-3 секунды, а часто даже больше, что связывает экземпляр приложения (что, вероятно, не так уж и ужасно если вы используете потоки или не заботитесь о производительности, но это определенно, если вы используете единорога). Итак, я объясню, как этого избежать, используя carrierwave:

1) Выберите фонового рабочего для своего приложения (я обычно использую Sidekiq)

2) Добавьте carrierwave_backgrounder в свой Gemfile и настройте его для работы с вашим фоновым рабочим и carrierwave (все в его readme)

Обычно у меня есть контроль над моими каталогами, поэтому я выбираю store_in_background вариант carrierwave_backgrounder, который обрабатывает и сохраняет изображение в файловой системе или S3, или в другом месте, которое вы используете.

3) Теперь, когда вы обновляете изображение, его обработка и сохранение переходят в фоновый режим, что освобождает ваш экземпляр приложения, но это занимает некоторое время, в большинстве случаев более 1 секунды, и вам нужно вернуть некоторый ответ пользователю.

4) Самый простой способ предоставить пользователю ответ - вернуть javascript, в котором вы меняете старое изображение на gif с помощью счетчика или что-то в этом роде, и установите функцию javascript SetInterval, которая проверяет, было ли обработано изображение (carrierwave_background предоставляет функцию который может изменить логический столбец вашей модели на истину после завершения обработки) отправка AJAX запроса каждые 2 секунды или что угодно и изменение изображения, когда оно будет обработано.

Теперь у вас есть несвязанный экземпляр приложения и одновременно хорошее взаимодействие с пользователем.

PS Я новичок в рельсах и веб-разработке как таковых, поэтому в этом руководстве могут быть некоторые оговорки, которые я пропустил.

Надеюсь, это кому-нибудь поможет.

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

person NoDisplayName    schedule 06.05.2015

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

person Joshua Partogi    schedule 07.12.2009

CarrierWave, вероятно, лучшее решение для загрузки изображений в Rails. В следующем сообщении описывается решение для загрузки изображений с помощью CarrierWave, в то время как преобразования изображений выполняются без проблем в облаке. Загруженные изображения хранятся в облаке и доставляются через CDN. Не нужно устанавливать RMagick, MiniMagick и ImageMagick. http://cloudinary.com/blog/ruby_on_rails_image_uploads_with_carrierwave_and_cloudinary

person Cloudinary    schedule 19.04.2012

attachment_fu (http://github.com/technoweenie/attachment_fu) - еще один вариант, хотя я лично рекомендовал бы скрепку. Он не требует Rmagick, что является большим плюсом, и поддерживает некоторые интересные функции, такие как загрузка в S3 с незначительной конфигурацией.

person samg    schedule 07.12.2009

Обновлено в августе 2019 г.

Для тех, кто недавно задавал этот вопрос, Rails 5.2+ теперь имеет ActiveStorage по умолчанию, и я настоятельно рекомендую проверить его. < / а>

Поскольку сейчас он является частью ядра Rails 5.2+, он очень хорошо интегрирован и имеет отличные возможности сразу после установки (все же все другие известные жемчужины, такие как Carrierwave, Shrine, скрепка, ... великолепны, но этот предлагает очень хорошие функции, которые мы можем рассмотреть для любого нового проекта Rails)

Команда Paperclip отказалась от этого драгоценного камня в пользу Rails ActiveStorage.

Вот страница github для ActiveStorage, и повсюду доступно множество ресурсов.

Важная заметка

Обратите внимание, что некоторые расширенные функции недоступны в ActiveStorage, но если ваш вариант использования прост, это может быть один из самых простых загружаемых драгоценных камней для установки и интеграции со сторонним облачным хранилищем (s3, цифровые океанские пространства и т. Д.)

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

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

Сравнение святыни с другими драгоценными камнями согласно их официальной странице

person Ahmed Elkoussy    schedule 21.09.2018