rails ajax调用的问题

时间:2010-10-13 01:02:30

标签: ruby-on-rails ajax

我对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调用。那么我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

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

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

首先,为了完成这项工作,您必须在布局<head>标记内包含所有必需的javascripts和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();
  });

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

只是一般性说明 - 我认为show行动应该使用get而不是post来访问。

- 编辑 -

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

答案 1 :(得分:0)

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