【问题标题】:Browser sometimes displays JSON text instead of desired page浏览器有时会显示 JSON 文本而不是所需页面
【发布时间】:2011-08-04 08:30:15
【问题描述】:

我的 Rails 应用程序出现间歇性问题,我无法弄清楚发生了什么。当用户登录时,他们会看到一个仪表板,其中包含一些执行 AJAX 调用的 JavaScript 代码。有时,当用户登录时,他们看到的不是仪表板,而是来自操作的 JSON 响应文本,而不是仪表板(在 Chrome 中),或者他们下载了一个 .json 文件(Firefox)。它是间歇性的,通常不会发生,但当它发生时真的很烦人。

以下是部分代码的简化版本:

在模板头部运行的JS:

$(function () {
    var remoteLink = $('#remoteLink');
    remoteLink.live("ajax:complete", function () {
        setTimeout(function () {
           loadCount();
        }, 30000);
    });    

    loadCount();

    function loadCount() {
      remoteLink.click();
    }
});

以及模板中的链接:

<%= link_to 'get count (hidden)', {:controller => 'something', :action => 'count'}, 
            :id => 'remoteLink', :class => 'hidden', :remote => true, 'data-type' => 'json' %>

控制器动作:

def count
    render :json => get_counts_function_returning_a_hash
end

我的预感是这是一种竞争条件——可能与 setTimeout 的使用有关? ——但我无法验证这种预感。谁能告诉我这里可能发生了什么?我也在其他网站上看到过这种情况——也是间歇性的,通常不会发生,但发生时很烦人。

【问题讨论】:

    标签: javascript ruby-on-rails ajax jquery


    【解决方案1】:

    您是否有任何使用 store_location 或类似功能在用户登录后将用户重定向到特定页面的身份验证代码?

    我曾经遇到过类似的问题,AJAX 回调导致 store_location 存储 JSON URL,并且用户被重定向到 JSON 响应而不是他们的仪表板。这很难追踪,因为用户必须在页面上闲置一段时间,然后才会显示错误。

    无论如何,我怀疑是这样的,而不是 Rails 的问题。

    【讨论】:

    • 哦,很有趣。我们没有专门使用 store_location,但我们有自己的类似实现。如果发生这种情况,我会调查并接受这个答案。
    • 你赢了!那是我的问题。我正在记录 AJAX 请求 URL 并在登录后将用户转发给它。如果用户在 JS 还在轮询服务器时退出,并且用户在没有点击应用中的任何其他链接的情况下返回登录页面,则会出现此问题。
    【解决方案2】:

    我会怀疑 HTTP 响应的 Content-Type 并检查您设置它的任何地方是否存在可能的错误。运行带有用于跟踪 HTTP 标头的扩展的浏览器,以捕获发生时的值。

    【讨论】:

    • 嗯,据我观察,它似乎设置正确(应用程序/json)。我没有在任何地方手动设置它——我认为 render :json 应该解决这个问题——我在 Firebug 和 Chrome 开发工具中看到 Content-Type: application/json 。但是,当我得到 304 Not Modified 时,没有 Content-Type 标头。不过,这对我来说似乎很好,因为我相信 304 不应该在正文中包含任何文本。然而,我实际看到的是仍然包含 JSON 正文的 304。也许在 304 响应中包含这个非空主体会在某些情况下导致问题?
    猜你喜欢
    • 1970-01-01
    • 2011-05-04
    • 2015-04-13
    • 1970-01-01
    • 2012-06-16
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    相关资源
    最近更新 更多