【问题标题】:Why does Rails ignore content-type when accepts is different?为什么当接受不同时Rails会忽略内容类型?
【发布时间】:2012-09-22 05:13:17
【问题描述】:

我有一个 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 标头。呵呵。

【问题讨论】:

    标签: ruby-on-rails ajax


    【解决方案1】:

    这可能是由于

    dataType: 'json',
    

    行,通知服务器你的请求内容是 JSON。

    【讨论】:

    • 你可能是对的,但我仍然很好奇为什么请求标头是:Content-Type:application/x-www-form-urlencodedAccept:application/json, text/javascript, */*; q=0.01。据我所知,Accept 用于您想要返回的文档类型,Content-Type 用于传入的文档类型。
    • 哪个错误让您认为 Rails 正在尝试读取 JSON? Rack 会自动将 body 转换为哈希,所以这可能是混淆点。
    • 而且,我的回答是错误的。 dataType 选项用于返回的数据。
    • 我想我的假设可能是错误的,Rack 应该尝试转换 urlencoded 文档,因为 Content-Type 是这样,但是当数据被 urlencoded 时我得到 422,并且当我将它转换为 JSON 字符串时它可以工作(尽管没有更改标题)
    • 我想我可能不够彻底,422 来自验证失败..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2011-01-14
    • 1970-01-01
    • 2012-07-02
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多