私はRESTfulコントローラーを持っています:
class Api::V1::DevicesController < ApplicationController
before_filter :require_user
respond_to :json
# PUT /api/v1/devices/1
def update
@device = Device.find(params[:id])
authorize! :update, @device
@device.update_attributes(params[:device])
respond_with @device
end
end
そして、クライアント側のいくつかの JS:
$("#click-me").on('click', function() {
$.ajax({
type: "PUT",
url: '/api/v1/devices/' + $(this).data('device-id'),
dataType: 'json',
accept: 'application/json',
data: {device: {user_id: null}, format: 'json'},
success: function () {
alert("Booya!");
}
})
});
AJAX が起動されると、デフォルトでは、jQuery は JS オブジェクトを URL エンコード文字列として送信します。そして、Content-Type:application/x-www-form-urlencoded
大丈夫です。そして、私が に設定dataType
した'json'
のでAccept:application/json, text/javascript, */*; q=0.01
、これも問題ないようです。
ただし、Rails がリクエストを受け取ると、コンテンツ タイプが URL エンコードされていても、投稿本文を JSON として扱います。これはバグですか?
これまでの私の解決策は、JS オブジェクトを JSON ( ) としてキャストし、JSON.stringify({device: {user_id: null}, format: 'json'})
それを送信することです。
Rails は Content-Type と Accept を別々に処理する必要があります。このアプリは 3.0.17 です。おそらくそれは以前のバージョンの問題でしょうか?
アップデート:
私が受け取った 422 は検証の失敗であり、Rack はさまざまな Content-Type ヘッダーと Accept ヘッダーを処理するのに十分スマートです。当たり前。