Я новичок в рельсах, так что извините, если это легко. Мне интересно, как лучше всего загружать изображения и отображать их в Ruby on Rails. У меня есть блог, и я хотел бы иметь возможность прикрепить изображение при создании сообщения.
Загрузка изображений Ruby on Rails
Ответы (8)
Скрепка довольно классная. Об этом есть отличный RailsCast - http://railscasts.com/episodes/134-paperclip
CarrierWave - это более новая жемчужина, чем Paperclip, и она выглядит намного более гибкой. Также есть 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 секунды, а часто даже больше, что связывает экземпляр приложения (что, вероятно, не так уж и ужасно если вы используете потоки или не заботитесь о производительности, но это определенно, если вы используете единорога). Итак, я объясню, как этого избежать, используя 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
, он потрясающий и может быть действительно хорошим вариантом в некоторых случаях.
Многие рекомендуют PaperClip. Возможно, вы захотите сначала попробовать это.
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 с незначительной конфигурацией.
Обновлено в августе 2019 г.
Для тех, кто недавно задавал этот вопрос, Rails 5.2+ теперь имеет ActiveStorage по умолчанию, и я настоятельно рекомендую проверить его. < / а>
Поскольку сейчас он является частью ядра Rails 5.2+, он очень хорошо интегрирован и имеет отличные возможности сразу после установки (все же все другие известные жемчужины, такие как Carrierwave, Shrine, скрепка, ... великолепны, но этот предлагает очень хорошие функции, которые мы можем рассмотреть для любого нового проекта Rails)
Команда Paperclip отказалась от этого драгоценного камня в пользу Rails ActiveStorage.
Вот страница github для ActiveStorage, и повсюду доступно множество ресурсов.
Важная заметка
Обратите внимание, что некоторые расширенные функции недоступны в ActiveStorage, но если ваш вариант использования прост, это может быть один из самых простых загружаемых драгоценных камней для установки и интеграции со сторонним облачным хранилищем (s3, цифровые океанские пространства и т. Д.)
Одним из основных недостатков, например, является то, что вы не можете определять пути для своих загрузок в ActiveStorage, для этого есть хак, чтобы каждая среда загружалась по разному пути (но все же это было для меня большим раздражением. )
Если ваша загрузка требует большей гибкости и расширенных функций, я рекомендую проверить Shrine.
Сравнение святыни с другими драгоценными камнями согласно их официальной странице