2009-12-07 3 views
36

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

ответ

3

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

7

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

Here's a link для более полного учебника.

+4

Избегайте хранения больших капель в базе данных - редко бывает случай, когда это хорошая идея. – bensie

2

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

3

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

4

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

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

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

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

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

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

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

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

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

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

Смежные вопросы