在Rails 3应用程序中使用jQuery-UJS进行远程link_to时出现分析器错误:我该如何调试?

mar*_*nza 9 ajax jquery ruby-on-rails

我正在尝试使用Rails 3 remote_link :remote => true和jQuery 单击链接后替换div的内容.

到目前为止,我已经能够在使用200 HTTP代码响应时让控制器呈现正确的部分.我设置了一些回调来找到问题的根源:

jQuery(function($) {
    $("#follow-link").bind("ajax:before", function() {
        console.log("ajax:before");
    });

    $("#follow-link").bind("ajax:success", function(data, status, xhr) {
        console.log("ajax:success");
    });

    $("#follow-link").bind("ajax:complete", function() {
        console.log("ajax:complete");
    });

    $("#follow-link").bind("ajax:error", function(xhr, status, error) {
        console.log("ajax:error");
        console.log(error);
    });
});
Run Code Online (Sandbox Code Playgroud)

虽然before并且complete被触发,success但是并且error输出"parsererror".我在Safari的开发人员工具中检查响应时得到的内容是一个简单的字符串.

为什么会引发一个parsererror?如何获得有关导致此错误的更多信息?

Ada*_*rin 12

parsererror即使我的远程链接正确地指向了操作:format => :js并且我的控制器操作正确地respond_to用于提供JSON对象,我也变得奇怪了:

respond_to do |format|
  format.js do
    render :json => {:something => "OK"}
  end
end
Run Code Online (Sandbox Code Playgroud)

解决方案最终只是将这一行放入我的application.js:

$.ajaxSettings.dataType = "json";
Run Code Online (Sandbox Code Playgroud)

默认情况下,似乎jQuery试图将所有响应评估为"script",我猜这意味着它试图将其作为代码执行 - ?一次删除此行就可以全局解决问题.

  • 设置`$ .ajaxSettings.dataType ='json';`也为我解决了'parsererror`问题.不过,我不知道为什么会这样做. (3认同)

sub*_*lue 5

不使用全局$.ajaxSettings.dataType = 'json';设置,更清晰的解决方案是向data-type表单元素添加属性.远程表单事件处理程序将把它作为dataType传递给jQuery AJAX调用,例如:

form_for @subject, :remote => true, :html => {'data-type' => 'json'}
Run Code Online (Sandbox Code Playgroud)


Ste*_*oss 3

我将提出一个答案,因为评论不允许任何格式。这是:服务器端发生了一些事情,jQuery 没有得到你想象的那样。以下是 jQuery 文档的摘录:

error(jqXHR, textStatus, errorThrown)Function 请求失败时调用的函数。该函数接收三个参数:jqXHR(在 jQuery 1.4.x 中为 XMLHttpRequest)对象、描述发生的错误类型的字符串以及可选的异常对象(如果发生)。第二个参数的可能值(除了 null 之外)有“timeout”、“error”、“abort”和“parsererror”。当发生 HTTP 错误时,errorThrown 会接收 HTTP 状态的文本部分,例如“未找到”或“内部服务器错误”。

这意味着您的控制器可能会使用预期数据之外的其他内容进行响应。在该控制器中,尝试:

Rails.logger.debug render_to_string(:partial => "followings/follow")
Run Code Online (Sandbox Code Playgroud)

无论如何,请检查您的日志以确保您认为正在发生的事情确实正在发生。另外,编写一个测试来验证这一点:

# controller spec... modify if using Test::Unit
it "sends cool javascript" do
  xhr.post :unfollow, :id => 83, :data-method => "delete"
  response.body should == "some known response"
end
Run Code Online (Sandbox Code Playgroud)

好吧,这是一个老套、脆弱的规范,但在你知道哪里出了问题之前它会起作用。

一旦你开始工作,其他一切都会井然有序。

  • 问题是我在控制器中使用“format.js”而不是“format.html”来渲染 html 部分。我仍然不知道为什么在 js 中渲染 html 部分会破坏一切,但现在它可以工作了。 (3认同)