Как заставить Carrierwave и jpegcam работать нормально?

#javascript #ruby-on-rails #ruby-on-rails-3 #paperclip #carrierwave

#javascript #ruby-on-rails #ruby-on-rails-3 #скрепка #carrierwave

Вопрос:

Я прочитал эту замечательную статью об использовании скрепки в приложении 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 на самом деле не имеет функции ‘upload’, скорее она использует объект model. Итак, я не совсем уверен, что вставить в контроллер, чтобы заставить его принять файл. И как обработать обратный вызов в javascript. (Я попробовал пару вещей, которые мне слишком неловко воспроизводить здесь. Передал объект image на контроллер, но не смог понять, как его обработать)

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

Ответ №1:

В итоге я исправил это с помощью огромного взлома.

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

 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 также создает временную копию файла).

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

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

Комментарии:

1. вы когда-нибудь находили более приятный способ сделать это?

2. Нет, никогда не делал. Но, честно говоря, я перестал искать. Типичный программист, не так ли? Если это сработает, просто используйте это и забудьте об этом 🙂