Качване на снимки 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 във вашата DB, можете да направите нещо като:

Модел:

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 и го конфигурирайте да работи с вашия фонов работник и операторска вълна (всичко в неговия 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, paperclip,... са страхотни, но този предлага много добри характеристики, които можем да вземем предвид за всеки нов Rails проект)

Екипът на Paperclip отхвърли скъпоценния камък в полза на Rails ActiveStorage.

Ето страницата в github за ActiveStorage и много ресурси са достъпни навсякъде

Важна забележка

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

Един от основните недостатъци например е, че не можете да дефинирате пътища за вашите качвания в ActiveStorage, има хак за това, така че всяка среда да качва по различен път (но все пак това беше голямо раздразнение за мен )

Ако вашето качване се нуждае от повече гъвкавост и разширени функции, препоръчвам ви да проверите Shrine

Сравнение на светилището с други скъпоценни камъни, според официалната им страница

person Ahmed Elkoussy    schedule 21.09.2018