0

私は Book と呼ばれるモデルを持っています。これは、has_many :photos (添付ファイルはペーパークリップで処理されます) です。

私は現在、libcurl を使用する Paul Dix のTyphoeus gem を使用して、JSON を介して Rails アプリと通信するクライアントを構築しています。

新しい Book オブジェクトを POST するのは簡単でした。「Hello There」というタイトルの新しい書籍レコードを作成するには、次のように簡単に行うことができます。

require 'rubygems'
require 'json'
require 'typhoeus'

class Remote
  include Typhoeus
end

p Remote.post("http://localhost:3000/books.json",
  { :params =>
    { :book => { :title => "Hello There" }}})

このクエリに写真を追加しようとすると、問題が発生します。HTML フォームを使用して添付ファイルを POST するだけで、次のようなクエリが作成されます。

 Parameters: {"commit"=>"Submit", "action"=>"create", "controller"=>"books", "book"=>{"title"=>"Hello There", "photo_attributes"=>[{"image"=>#<File:/var/folders/1V/1V8Kw+LEHUCKonqJ-dp3oE+++TI/-Tmp-/RackMultipart20090917-3026-i6d6b9-0>}]}}

したがって、私の仮定は、Remote.post 呼び出しで同じクエリを再作成しようとしているということです。

私は、ハッシュ内のハッシュの配列の構文を最大限に活用していると考えています。私は期待していたもののバリエーションを試みてきました。これは次のようなものです。

p Remote.post("http://localhost:3000/books.json", 
  { :params => 
    { :book => { :title => "Hello There",
                 :photo_attributes => [{ :image => "/path/to/image/here" }] }}})

しかし、これは私がハッシュにしようとしているものを文字列に連結しているようで、返されます( :image => "" ハッシュで何をしても):

NoMethodError (undefined method `stringify_keys!' for "image/path/to/image/here":String):

しかし、これがうまくいかない場合、ここで私の構文の何が問題なのかを理解するのにあまり時間を無駄にしたくないので、私はここに来ると思った.

私の質問は次 のとおりです。私は正しい軌道に乗っていますか? 奇妙に連結された文字列の代わりにハッシュの配列を投稿するようにこの構文をクリアすると、画像を Book オブジェクトに渡すのに十分でしょうか?

それとも私はこれに間違って近づいていますか?

4

1 に答える 1

1

実際には、xhr 経由でファイルを投稿することはできません。javascript には、ファイルをまったく処理できないようにするためのセキュリティ上の予防措置があります。これを回避する秘訣は、ファイルを非表示の iframe に投稿することです。iframe はサーバーに定期的に投稿し、ページ全体の更新を回避します。この手法はいくつかの場所で詳しく説明されています。おそらくこれを試してみてください (彼らは php を使用していますが、原則は同じままであり、役立つ長い議論があります):

非表示の iframe にファイルを投稿する

于 2009-09-17T23:41:31.573 に答える