0

私は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 ヘッダーを処理するのに十分スマートです。当たり前。

4

1 に答える 1

0

これはおそらく

dataType: 'json',

これは、リクエストのコンテンツが JSON であることをサーバーに通知します。

于 2012-10-01T11:42:01.800 に答える