2012-03-29 7 views
3

私の人生のために、どのように基本的なpaperclip exampleの仕組みがわかりません。そこコントローラに含まれて1行だけだし、それは私が単にそれがS3に画像をアップロードするために必要なことすべてだか理解していないpaperclip gemを使用してS3に画像をアップロードするには

@user = User.create(params[:user]) 

です。私は例をかなり変更しました。なぜなら、デフォルトのレールフォームヘルパーではなく、jquery file uploaderを使用したかったので、私はコントローラに画像がPOSTされているところにいますが、 paramsから画像を取り出し、それを添付ファイルとして割り当てるはずです。ここで私は、ログを見ているものです:

Parameters: {"files"=>[#<ActionDispatch::Http::UploadedFile:0x132263b98 @tempfile=#<File:/var/folders/5d/6r3qnvmx0754lr5t13_y1vd80000gn/T/RackMultipart20120329-71039-1b1ewde-0>, @headers="Content-Disposition: form-data; name=\"files[]\"; filename=\"background.png\"\r\nContent-Type: image/png\r\n", @content_type="image/png", @original_filename="background.png">], "id"=>"385"}

私のJSは非常に簡単です:私は知っているために役立つだろう何

` $('#fileupload').fileupload({ 
    dataType: 'json', 
    url: '/my_url', 
    done: function (e, data) { 
     console.log('done'); 
    } 
});` 

は私がPOSTさからファイルデータを取り除くことができる方法であります上記のパラメータをpaperclipに渡します。私は添付ファイルの属性にFile.open(...)の値を割り当てなければならないと確信していますが、私のファイルのソースはわかりません。

私はこれを理解しようとばかげた時間を費やしてしまい、私はそれを得ることができません。私はs3に直接アップロードしようとしましたが、一連のイベントはひどく混乱していました。この単純なパススルーの例を最初に完成させたいと思います。あなたがcnaを与えるどんな助けでもありがとう!

答えて

4

これ以上の数が必要です。使用しているコードを正確に表示することができれば助かります。

ペーパークリップを使ってS3に投稿することができます

あなたのコントローラが、それはすべてのparamsに沿って送信しているUserモデルを作成し、

http://rubydoc.info/gems/paperclip/Paperclip/Storage/S3

。これは「質量割り当て」と呼ばれます(attr_accessibleについては必ず読んでください)。

モデルがparamsを受信すると、そのモデルはPaperclip AWSプロセッサを使用してアップロードされます。

AWS gem、S3上の有効なバケット、設定ファイルが必要です。

このブログの記事を試してみて、それはあなたを助け場合はお知らせ:

http://blog.trydionel.com/2009/11/08/using-paperclip-with-amazon-s3/

UPDATE 2013年4月3日:あなたは追加のパラメータが必要な場合がありますbelow--クロエさんのコメントを参照して喜ばれ、ブログ投稿が古くなっている可能性があります。

+0

私はこのことを十分に理解していますが、なぜPaperclipが期待するすべての属性をparamsに含めることができるのか理解できません。フォームヘルパーがこれを処理している場合を除き、私は理解していますが、フォームヘルパーを使用しないため、回避策を見つける必要があります。いくつかのJSでOPを編集しました。ありがとう –

+0

私の提案は、jQueryを使わずに、デモが示すように動作させることです。それが正常に動作したら、jQueryを追加します。このアプローチは、ステップバイステップで作業することを容易にします。 – joelparkerhenderson

+0

ブログ投稿が悪いおそらく時代遅れです。手順に従ってエラーを出してください。 Paperclip RubyDocで言及されていないことの1つは、has_attached_fileに ':storage =>:s3'を追加することです。あたかも ':s3_credentials'で十分であるかのように見せかけますが、そうではありません。 – Chloe

1

あなたはそれを手動で行いたい場合は、このようにそれに近づく:

# In order to get contents of the POST request with the photo, 
# you need to read contents of request 
upload = params[:file].is_a(String) 
file_name = upload ? params[:file] : params[:file].original_filename 
extension = file_name.split('.').last 

# We have to create a temp file which is going to be used by Paperclip for 
# its upload 
tmp_file = "#{Rails.root}/tmp/file.#{extension}" 
file_id = 0 

# Check if file with the name exists and generate unique path 
while File.exists?(tmp_file) do 
    tmp_file_path = "#{Rails.root}/tmp/file#{file_id}.#{extension}" 
    id += 1 
end 

# Let's write the file from post request to unique location 
File.open(tmp_file_path, 'wb') do |f| 
    if upload 
    f.write request.body.read 
    else 
    f.write params[:file].read 
    end 
end 

# Now that file is saved in temp location, we can use Paperclip to mimic one file 
# upload 
@photo = Photo.new :photo => File.open(tmp_file_path) 

# We'll return javascript to say that the file is uploaded and put its thumbnail in 
# HTML or whatever else you wanted to do with it 
respond_to do |format| 
    if @photo.save 
    render :text => "Success" 
    else 
    render :text => @photo.errors 
    end 
end 

あなたのcreateまたは何あなたがフォームを投稿している先のURLとして使用を書き換えることができます。

0

このビット:

"files"=>[#<ActionDispatch::Http::UploadedFile:0x132263b98 @tempfile=#  <File:/var/folders/5d/6r3qnvmx0754lr5t13_y1vd80000gn/T/RackMultipart20120329-71039-1b1ewde-0> 

形式で掲載されているファイルの内容を保持している部分(と思う)です。Railsでは

、Userモデルにはヘルパーを持っています:has_attached_file

渡す[:のparams]をUser.create方法には、ヘルパーは、ファイルの内容をピックアップすることができ、それらに任意の処理を行う(例えば、サイズ変更ヘルパーに提供された属性に基づいて)、そしてあなたのストレージに画像をプッシュします(例えば、S3や何でも - S3認証がヘルパーに渡されます)。

うまくいけば、「それはどうしているのですか?質問

jQueryのビットが何であるべきかわかりませんが、Railsフォームを:remote => trueで使用してjqueryで応答を処理するのはなぜですか?

関連する問題