これは、「どうやってこれを機能させるか」ではなく、「なぜこのように機能するのか」という問題です。
私のアプリは、JSON を返すサード パーティの REST API を呼び出しており、独自のJSON API の一部として結果を返しています。
私は Rails 3respond_to
とrespond_with
メソッドを使用していました。リクエストの場合GET
、これは期待どおりに機能し、JSON を通過するだけです。
の場合はPOST
、返されたオブジェクトから URL を作成して:location
オプションに渡すなど、さらに多くのことを行います。しかし、私のオブジェクトは単なる JSON (ActiveRecord ではない) であるため、エラーが発生します。
例えば...
# POST /api/products.json with params id=:id
def create
query_string = "#{user_id}&id=#{params[:id]}"
@products = third_party_api_wrapper.products(query_string, 'POST')
respond_with @products
end
サードパーティ API のラッパーが POST リクエストを発行すると、正常に返されます。Rails は 500 エラーを返し、次のようにログに記録されます。
NoMethodError (undefined method `{"response":{"message":"product 4e1712d9ec0f257c510013f8 selected"}}_url' for #<MyController>
Rails は、私の @products オブジェクトにロケーション URL の作成方法を認識させたいと考えています。
明確化:@products
サード パーティの API によって返されるオブジェクトは、純粋な JSON (上記のエラー ログ メッセージに埋め込まれている文字列) です。このエラーが発生するのは、Rails がオブジェクトをもっと何かにしたいように見えるためです。Rails の内部 API サポートでは、それは ActiveRecord オブジェクトです。
新しいrespond_with
構文を古いスタイルに置き換えると
respond_to do |format|
format.json { render :json => @products } # note, no :location or :status options
end
その後、すべてが機能します。そして、これは私がやったことなので、「どのように」の問題ではなく、「なぜ」という質問があります。
イントロダクションに関するRyan Daigle の投稿は、何が起こっているかを説明しています。
私の質問は:なぜはrespond_with
データ (および HTTP ステータス) 以外のものを期待しているのですかPOST
?
それが間違っていると言っているのではなく、Rails 実装の理論的根拠を理解しようとしているだけです。