【问题标题】:problems with rails ajax callrails ajax调用的问题
【发布时间】:2010-10-15 04:08:14
【问题描述】:

我对 Rails 还很陌生,所以如果我在这里犯了一些愚蠢的错误,请原谅我。我正在尝试使用 link_to 进行 ajax 调用,并响应 js.erb 模板。情况不太好。链接正确呈现:

 <a href="/show" data-method="post" data-remote="true" rel="nofollow">Click</a>

准系统展示动作:

def show
  respond_to do |format|
    format.js {render :layout => false}
  end
end

并且 show.js.erb 只包含一个用于测试的警报。当我单击链接时,我被毫不客气地引导到 localhost:3000/show,它完全是空白的。尽管将方法声明为 POST,但它似乎是一个 GET 请求,我收到“406 Not Acceptable”错误。

Started GET "/show" for 127.0.0.1 at Tue Oct 12 19:58:17 -0500 2010
Processing by PostsController#show as HTML
Completed 406 Not Acceptable in 1ms

编辑:我在 show 操作中做了 request.xhr 测试,显然没有进行 ajax 调用。那么我在这里做错了什么?

【问题讨论】:

  • 你的布局是否包含javascript_include_tag的脚本?

标签: ruby-on-rails ajax


【解决方案1】:

根据您的描述,您的链接似乎没有附加不显眼的 JavaScript 侦听器,因此浏览器只是跟随链接的 href。所以问题似乎出在客户端。

但是你的问题没有提供足够的细节来给出一个直接的答案,所以我只列出我将采取的所有步骤来调查这个问题。

首先,要完成这项工作,您必须在布局 &lt;head&gt; 标记中包含所有必需的 javascript 和 csrf 元标记。最好这样做:

<%= javascript_include_tag :defaults %>
<%= csrf_meta_tag %>

如果您有这个,请加载页面并查看源代码是否确实正确生成了链接。您应该会看到如下内容:

<head> 
    <script src="/javascripts/prototype.js?1285857859" type="text/javascript"></script> 
    <script src="/javascripts/effects.js?1285857859" type="text/javascript"></script> 
    <script src="/javascripts/dragdrop.js?1285857859" type="text/javascript"></script> 
    <script src="/javascripts/controls.js?1285857859" type="text/javascript"></script> 
    <script src="/javascripts/rails.js?1285857859" type="text/javascript"></script> 
    <script src="/javascripts/application.js?1285934960" type="text/javascript"></script> 
    <meta name="csrf-param" content="authenticity_token"/> 
    <meta name="csrf-token" content="b2HRysd23edj1/vrCSRDSac0seDFae3n2gCoTjt0="/> 
</head>

如果它们在那里,我会安装 Firebug Javascript 调试器或使用 Chrome 开发人员工具,将其打开并查看页面加载和单击链接时是否有任何错误。您还可以查看发送的请求,看看它们是否是 xhr。

如果仍然无法正常工作,请在 Firebug 中打开 rails.js,并在负责在 data-remote 和/或 data-method 上附加侦听器的代码之前设置断点。就是这个:

document.on("click", "a[data-remote]", function(event, element) {
    if (event.stopped) return;
    handleRemote(element);
    event.stop();
  });

在第一行设置断点,在处理函数内设置第二个断点。然后重新加载页面,看看它是否附加了监听器。然后单击链接并查看处理程序是否被触发。然后……这取决于发生了什么。希望你可以自己继续。

只是一般说明 - 我认为应该使用 get 而不是 post 访问 show 操作。

-- 编辑--

我认为406 not acceptable 被返回是因为您的respond_to 块中没有format.html。如果你添加它,那么它应该只呈现show.html.erb 模板。

【讨论】:

  • 我有萤火虫,是的,包含正确的 js 文件。页面加载或单击链接时没有相关错误。没有 xhr 请求,只有 406 get 请求。我不知道我应该如何“查看它是否附加了侦听器”,但处理函数已被触发。
  • 我的意思是如果执行到达document.on 行。那么如果处理函数被触发,它会到达第二行(handleRemote(element))吗?如果是,请尝试更深入地调试它,看看它为什么不发送 xhr 请求。
【解决方案2】:

啊哈,问题是 jQuery 与prototype.js 冲突。我将它设置为 noConflict 模式并且它工作。

【讨论】:

  • 您是如何提出这个解决方案的?难道只是“啊哈”!时刻,还是你调试了代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
相关资源
最近更新 更多