Подтвердить что ты не робот

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

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

4b9b3361

Ответ 3

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

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

Ответ 4

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

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, он потрясающий и может быть действительно хорошим вариантом в некоторых случаях.

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

Для тех, кто недавно проверял этот вопрос, Rails 5. 2+ теперь имеет ActiveStorage по умолчанию & Я настоятельно рекомендую проверить это.

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

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

Вот страница GitHub для ActiveStorage & множество ресурсов доступно везде

Важное замечание

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

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

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

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