2010-10-13 52 views
1

我是相当新的轨道,所以原谅我,如果我在这里犯了一些愚蠢的错误。我正在尝试使用link_to进行ajax调用,并响应js.erb模板。它不太好。链接正确呈现:问题与铁轨阿贾克斯调用

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

准系统show动作:

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

而且show.js.erb只包含用于测试的警报。当我点击链接时,我毫不客气地被引导到localhost:3000/show,这是完全空白的。它似乎是一个GET请求,尽管将该方法声明为POST,并且出现“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 

编辑:我做了一个测试request.xhr在表演的动作,显然不包括Ajax调用正在取得进展。那么我在这里做错了什么?

+0

您的布局是否通过'javascript_include_tag'包含脚本? – 2010-10-13 01:52:38

+0

是的,它的确如此。 asdf – herpderp 2010-10-13 04:24:26

回答

0

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

+0

你是怎么想出这个解决方案的?这只是一个“啊哈!”一时,还是你调试了代码? – Matt 2010-10-15 17:57:51

1

从您的描述中可以看出,您的链接看起来像没有隐藏的JavaScript监听器,因此浏览器只是遵循链接的href。所以这个问题似乎在客户端。

但是,您的问题没有给出足够的细节以给出直接的答案,所以我只列出我为调查此问题而采取的所有步骤。

首先,为了使这项工作,你必须在你的布局<head>标签内包含所有必需的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(); 
    }); 

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

而只是一个普遍的说明 - 我认为show行动应与get而不是post访问。

- 编辑 -

我觉得406 not acceptable返回,因为你没有format.htmlrespond_to块做。如果你添加它,那么它应该只呈现show.html.erb模板。

+0

我有萤火虫,是的,包括正确的js文件。页面加载时或点击链接时没有相关的错误。没有xhr请求,只是406请求。我不知道我应该“看看它是否附加了侦听器”,但是处理函数被触发。 – herpderp 2010-10-13 19:14:51

+0

我只是说如果执行到'document.on'行。所以如果处理函数被触发,它是否到达第二行('handleRemote(element)')?如果确实如此,请尝试更深入地调试以了解为什么它不发送xhr请求。 – Matt 2010-10-13 22:44:05

+0

我已经找出问题所在,请看 – herpderp 2010-10-15 17:46:09