我有一個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標頭。咄。
你可能是對的,但我仍然很好奇爲什麼請求標頭是: 'Content-Type:application/x-www-form-urlencoded'和'Accept:application/json,text/javascript, */*; Q = 0.01'。據我所知,Accept是用於你想要的文件類型,而Content-Type用於傳入文件類型。 – stuartc
哪個錯誤會讓你覺得Rails試圖讀取JSON? Rack自動將身體轉換爲散列,所以也許這就是困惑點。 – rewritten
而且,我的回答是錯誤的。 dataType選項用於返回的數據。 – rewritten