2012-10-01 41 views
0

我有一個RESTful控制器:爲什麼接受不同時Rails會忽略內容類型?

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獲取請求時,它將郵件正文視爲JSON,即使內容類型是URL編碼。這是一個錯誤?

到目前爲止,我的解決方案是將JS對象強制轉換爲JSON(JSON.stringify({device: {user_id: null}, format: 'json'}))並將其提交。

但是這並不好,當然Rails應該分別處理Content-Type和Accept。這個應用程序在3.0.17。也許這是早期版本的問題?

UPDATE:

原來我收到的422是一個驗證失敗,和機架是足夠聰明,對付不同的Content-Type和Accept標頭。咄。

回答

0

這也許是由於

dataType: 'json', 

線,告知您請求的內容是JSON服務器。

+0

你可能是對的,但我仍然很好奇爲什麼請求標頭是: 'Content-Type:application/x-www-form-urlencoded'和'Accept:application/json,text/javascript, */*; Q = 0.01'。據我所知,Accept是用於你想要的文件類型,而Content-Type用於傳入文件類型。 – stuartc

+0

哪個錯誤會讓你覺得Rails試圖讀取JSON? Rack自動將身體轉換爲散列,所以也許這就是困惑點。 – rewritten

+0

而且,我的回答是錯誤的。 dataType選項用於返回的數據。 – rewritten

相關問題