【问题标题】:Rails 4 controller not returning well formed JSONRails 4 控制器未返回格式良好的 JSON
【发布时间】:2013-12-02 01:37:08
【问题描述】:

我正在使用 Rails 4 构建一个 Web 应用程序,我偶然发现 Rails 控制器和 JQuery 之间存在一些奇怪的行为,我不确定是因为我做错了什么,还是真的对 Rails 由 JQuery 返回的 JSON 有误解.请参阅以下咖啡脚本:

咖啡脚本:

$.get('/get_experiment', (data) -> 
  console.log 'Success:'
  console.log JSON.parse data
).error (data) ->
  console.log 'Failure:'
  console.log JSON.parse data.responseText

我们只是通过 GET 调用控制器的方法,处理成功和失败并显示返回的数据。

控制器:

def get_experiment
  respond_to do |format|
    format.js { render json: {} }
  end
end

这个控制器只是简单地回复一个空的哈希。


运行此示例时,控制台会显示带有“Failure”文本的空 JSON,这显然表明它认为 JSON 格式不正确。

我不明白为什么空哈希会被视为格式错误的 JSON。如果你把它替换成render json: {foo: 'bar'},它仍然会调用error方法。

【问题讨论】:

  • 我试过了,效果很好(显示成功文本和解析的 JSON 哈希)。是否有其他代码干扰了您的响应?也许是 before_filter?

标签: jquery ruby-on-rails ruby json coffeescript


【解决方案1】:

试试这个:

  1. 在您的 CoffeeScript 文件中使用 $.getJSON() 而不是 $.get()
  2. 还将路径从/get_experiment 更改为/get_experiment.json
  3. 在您的控制器中使用format.json { ... } 而不是format.js

说明

  1. 这一步不是必须的。但是如果你使用$.getJSON:

    • jQuery 发送一个Accept: application/json 标头
    • jQuery 解释入站响应,将其转换为 JavaScript 对象,并将其传递给回调(因此您不必弄乱 eval 或其他转换机制)。 (来自difference between $.getJSON and $.get
  2. 如果请求的文档中没有扩展名(如 .js、.xml、.json),Rails 会假定客户端请求 HTML 页面。但是,由于您没有在控制器操作中指定format.html,这将导致错误。

  3. 既然您现在请求的是 JSON 文档,您需要在控制器操作中指定正确的处理程序。

【讨论】:

  • 我的问题的直接答案是你的第三点。 format.js 导致了这个错误。我找不到任何关于它的文档,如果有人好奇的话,我只是偶然发现了这个blog.plataformatec.com.br/2009/08/…。谢谢安德烈!
【解决方案2】:

如果您将 JSON 包装在这样的数组中:render json: [{}],那么它将执行成功方法而不是错误方法。

所以最终我找到了解决问题的方法,但我很困惑为什么我不能简单地做这样的事情:render json: @user.to_json

我必须这样做:render json: [@user.to_json]

有什么线索吗?

【讨论】:

    【解决方案3】:

    运行此示例时,控制台会显示带有“失败”文本的空 JSON,这显然表明它认为 JSON 格式错误。

    在我的理解中,这不是发生的事情:error 回调被调用是因为请求失败(返回非 200 状态)并且与 json 无效无关(它不是)。

    为了进一步调试您的问题,我建议如下:

    • 在浏览器中检查 http 请求并检查它是否真的成功(状态 200)
    • 检查您的 rails 日志并检查请求是否确实成功(您应该会看到类似“Completed 200 OK”的内容)
    • 在您的成功和错误处理程序中执行console.log(data) 并检查data 的实际含义。目前您尝试JSON.parse 一次data 和一次data.responseText...
    • 通读文档:http://api.jquery.com/jQuery.ajax/http://api.jquery.com/jQuery.get/,尤其是关于 dataType 的部分:如果服务器返回正确的 json 响应(具有正确的内容类型)或者如果您将 dataType 显式设置为 'json'在请求中,那么 jQuery 应该会自动为您解析响应,并且回调中的 data 对象应该已经是解析后的响应内容...

    【讨论】:

      【解决方案4】:

      您是否正确使用了强参数?我过去遇到过这个问题,因为我不允许这些参数通过。

      http://weblog.rubyonrails.org/2012/3/21/strong-parameters/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-27
        • 2021-05-14
        • 2018-11-17
        • 2014-06-13
        • 2016-04-27
        • 2020-07-07
        • 2017-05-26
        • 1970-01-01
        相关资源
        最近更新 更多