我有一个 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 收到请求时,它会将帖子正文视为 JSON,即使内容类型是 URL 编码的。这是一个错误吗?
到目前为止,我的解决方案是将 JS 对象转换为 JSON ( JSON.stringify({device: {user_id: null}, format: 'json'})
) 并提交它。
但这感觉不是很好,当然 Rails 应该分别处理 Content-Type 和 Accept 。此应用程序在 3.0.17 中。也许这是早期版本的问题?
更新:
结果我收到的 422 是验证失败,而 Rack 足够聪明,可以处理不同的 Content-Type 和 Accept 标头。呃。