Аз съм нов в релсите, така че съжалявам, ако това е лесно. Чудя се кой е най-добрият начин да качвам снимки и да ги показвам в 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 във вашата 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
Ето връзка към по-пълен урок.
Много препоръчват да се използва 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
, той е невероятен и може да бъде наистина добър вариант в някои случаи.
Много хора препоръчват 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, paperclip,... са страхотни, но този предлага много добри характеристики, които можем да вземем предвид за всеки нов Rails проект)
Екипът на Paperclip отхвърли скъпоценния камък в полза на Rails ActiveStorage.
Ето страницата в github за ActiveStorage и много ресурси са достъпни навсякъде
Важна забележка
Моля, имайте предвид, че някои разширени функции не са налични в ActiveStorage, но ако вашият случай на употреба е прост, това може да бъде един от най-лесните скъпоценни камъни за качване за инсталиране и интегриране с облачно хранилище на трета страна (s3, цифрови океански пространства, ....)
Един от основните недостатъци например е, че не можете да дефинирате пътища за вашите качвания в ActiveStorage, има хак за това, така че всяка среда да качва по различен път (но все пак това беше голямо раздразнение за мен )
Ако вашето качване се нуждае от повече гъвкавост и разширени функции, препоръчвам ви да проверите Shrine
Сравнение на светилището с други скъпоценни камъни, според официалната им страница