Сделать Carrierwave и jpegcam хорошими? - PullRequest
2 голосов
/ 19 мая 2011

Я прочитал это хорошая статья об использовании Paperclip в приложении rails3 для захвата изображений с веб-камеры.

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

То, с чем я борюсь, это как заставить Carrierwave принять файл из флеш-изображения с jpegcam . Похоже, что Paperclip больше ориентирован на файлы, а Carrierwave - больше на объект.

Вот что я пытаюсь:

У меня есть модель с установленным на ней загрузчиком carrierwave:

class Individual < ActiveRecord::Base

  mount_uploader :picture, PictureUploader

И в представлении (представление «редактировать»):

#webcam
  = embed{:id => 'webcam_movie'}... (the embedded flash)...

= submit_tag "Take picture", :onclick => 'webcam.snap();'

= form_for @individual, :html => {:multipart => true} do |f|
  = f.text_field :firstname
  = f.text_field :lastname
  = f.file_field :picture
  = f.submit

= content_for :javascripts do
  :javascript
    function upload_complete(msg) {
       if (msg) {
           ????
     } else {
       alert('An error occured');
       webcam.reset();
     }
   }
   webcam.set_hook('onComplete', 'upload_complete');

Моя проблема в том, что Carrierwave на самом деле не имеет функции «загрузки», а использует объект модели. Так что я не совсем уверен, что положить в контроллер, чтобы заставить его принять файл. И как обработать обратный вызов в JavaScript. (Я попытался сделать несколько вещей, которые мне слишком неловко воспроизводить здесь. Получил объект изображения на контроллере, но не смог понять, как его обработать)

Кто-нибудь может мне помочь? Спасибо.

1 Ответ

3 голосов
/ 20 мая 2011

Я решил исправить это с помощью огромного хака.

В моем контроллере я сделал:

def upload
  @individual = Individual.find(params[:individual_id])
  File.open(upload_path, 'w:ASCII-8BIT') do |f|
    f.write request.raw_post
  end
  @individual.picture = File.open(upload_path)
  if @individual.save!
    render :text => "ok"
  end
end

private

def upload_path # is used in upload and create
  file_name = 'temp.jpg'
  File.join(::Rails.root.to_s, 'public', 'uploads', file_name)
end

Таким образом, я записываю изображение в файл, который затем записывается в carrierwave. (Конечно, carrierwave также создает временную копию файла).

Это очень уродливо и, вероятно, оскорбляет всех богов Рельсов, но это работает.

Я задал вопрос в списке несущей волны, могу ли я вырезать бит временного файла и каким-то образом просто прочитать «request.raw_post» в объект загрузчика, но не ясно, что я могу.

...