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 收到请求时,它会将帖子正文视为 JSON,即使内容类型是 URL 编码的。这是一个错误吗?

到目前为止,我的解决方案是将 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 回答