我对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调用。那么我在这里做错了什么?
答案 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模式并且有效。