これに似た質問があることは知っていますが、まだ良い答えが見つかりませんでした。画像、クリップアタッチメント:Rails JSON APIにファイルを送信する
has_attached_file :image
今、私は画像を送信することを読んだ私は何をする必要があることは、私と呼ばれるものを含め、いくつかの異なる属性を含み方法を、作成のいずれかにオブジェクトの説明を送っていますbase64で画像をエンコードしてデコードすることでJSONで直感的に行うことができますが、それは私の厄介な解決策のように感じます。より良い方法が必要です。
もう1つの解決策は、1つより多くのmultipart/form-dataリクエストを送信することです。LEEjava describes here.この問題は、リクエストパラメータがRails 3.2.2で正しく解釈されず、JSON.parseがparamsを解析しようとするか、あるいは何かを誤って解釈しているRailsかもしれません。
Started POST "/api/v1/somemodel.json?token=ZoipX7yhcGfrWauoGyog" for 127.0.0.1 at 2012-03-18 15:53:30 +0200 Processing by Api::V1::SomeController#create as JSON Parameters: {"{\n
\"parentmodel\": {\n \"superparent_id\": 1,\n
\"description\": \"Enjoy the flower\",\n \"\": "=>{"\n
{\n \"someattribute\": 1,\n
\"someotherattribute\": 2,\n \"image\": \"image1\"\n
}\n "=>{"\n }\n}"=>nil}}, "token"=>"ZoipX7yhcGfrWauoGyog"}
これを読むのは非常に難しいです。 JSON.parse(のparams [:parentmodel])は、ここでは不可能である、と私はできないJSON.parse(のparams)のいずれかのためにトークンの属性の、JSON.parse(のparams)は、このエラーがスローされます:
TypeError (can't convert ActiveSupport::HashWithIndifferentAccess into String)
これは、私がこの問題に完全に間違っていると信じるように導くか、何かをやっているだけです。いずれにせよ、私は何かについて間違っていると確信することができます。 :)
もっと良い方法がありますか?誰かが私をガイド/チュートリアルに導くことができますか、これにどのようにアプローチすべきかを説明する答えを書くことができますか?
は、事前にありがとうUPDATE: だから私は実際にはなく、テストだけで、今働いてそれを持っています。私はこれがどのように機能するかは完全には分かっていないが、おそらく誰かが私のためにギャップを埋めることができるだろうか?これはテストコードの一部です(画像:fixture_file_upload(...)は重要な部分です)。
parts_of_the_object = { someattribute: 0, someotherattribute: 0, image: fixture_file_upload('/images/plot.jpg', 'image/jpg') }
私のparams []は、通常のHTMLフォームが奇妙な(そして素晴らしい)である、提出されたようになっています
Parameters: {"superparentid"=>"1", "plots"=>[{"someattribute"=>"0", "someotherattribute"=>"0", "image"=>#<ActionDispatch::Http::UploadedFile:0x007f812eab00e8 @original_filename="plot.jpg", @content_type="image/jpg", @headers="Content-Disposition: form-data; name=\"plots[][image]\"; filename=\"plot.jpg\"\r\nContent-Type: image/jpg\r\nContent-Length: 51818\r\n", @tempfile=#<File:/var/folders/45/rcdbb3p50bl2rgjzqp3f0grw0000gn/T/RackMultipart20120318-1242-1cn036o>>}], "token"=>"4L5LszuXQMY6rExfifio"}
要求が同じように作られており、ポスト要求がRSpecので構成されています
post "/api/v1/mycontroller.json?token=#{@token}", thefull_object
だから私はそれがすべて働いている。私はちょうどそれがどのように動作するのか分かりません! RSpecだけでなく、私自身もこのようなレスポンスを作りたいと思っています。 :-)
dev/prodモードで動作しない場合は、数日前に解決策を見つけましたが、答えを書いてください。これはあなたのものによく似ていますが、私はモデルでそれをやっています(Base64データをimage_data属性に直接送ります)。私はあなたのソリューションがより好きです。それがどうなるか教えてください。できれば助けます。 –
私は答えが正しいことから、私は賞金を授与しています。 –
これは良い答えですが、少なくともRails 3/Ruby 1.9にはいくつかの小さな穴があります。 まず、書き込み後に 'tempfile.rewind()'を確認してください。そうでなければ、長さ0のファイルが得られます。 – Shannon