2

Rails3アプリでPaperclipを使用してWebカメラから写真をキャプチャすることに関するこの素晴らしい記事を読みました。

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でコールバックを処理する方法。(恥ずかしすぎてここで再現できないことをいくつか試しました。画像オブジェクトをコントローラーに渡しましたが、それを処理する方法がわかりませんでした)

誰でも私を助けることができますか?ありがとう。

4

1 に答える 1

3

私はこれを巨大なハックで修正しました。

私のコントローラーでは、次のことを行いました。

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 の神々を怒らせるでしょうが、うまくいきます。

一時ファイルのビットを切り取って、どうにかして "request.raw_post" をアップローダ オブジェクトに読み込むことができるかどうか、carrierwave リストで質問しましたが、できるかどうかは明らかではありません。

于 2011-05-20T15:57:55.060 に答える