2011-08-29 60 views
5

我有一个简单的表格:为什么Rails UJS ajax:成功绑定被调用两次?

= form_for(posts_path, :id => "new_post", :remote => true) do 
    = text_field_tag "post[input]" 
    = submit_tag "Post!" 

我已绑定回调到ajax:success事件:

$("form#new_post").bind("ajax:success", function(xhr, data, status){ 
    alert("Post Created!"); 
}); 

当我点击Post!按钮时,Post Created出现两次。为什么?

我使用的是Rails 3.1,它默认使用jquery-ujs。

回答

5

类似的事情发生在我升级应用程序从Rails 3.0到3.1,这是我的错误。在您的

app/assets/javascripts/application.js 

检查你是不是要求两次轨道帮手,我一直在使用

//= require_tree . 

我已删除了这一点,刚刚离开

//= require jquery 
//= require jquery_ujs 
//= require myscripts 

我删除过app/assets/javascripts/rails.js烦恼,该文件是由jquery-rails gem生成的,但这不再是必要的

+0

我有同样的问题,我的JavaScript资产没有被包括两次。 ajax:成功仍然被调用两次,即使没有require_tree指令激活。 –

+0

谢谢。我有同样的问题。删除require_tree帮助解决了这个问题。 –

9

这是因为在/public/assets中存在预编译资产时,您的页面正在以开发模式加载jquery_ujs代码两次。

在javascript中requries装载有独立标签的发展模式:jqueryjquery_ujs.jsmyscripts.js终于applications.js。当预编译application.js存在并且从/public/assets使用时会出现问题 - 它包含所有先前文件的编译。这是由assets:precompile rake任务触发的。

解决方法是删除开发中的/public/assets目录,然后使用application.js(来自/app/assets/javascript),该文件不包含以前的文件。 一般不会在开发中使用assets:precompile rake任务。

更新

添加config.serve_static_assets = falsedevelopment.rb也解决了问题,我无需担心/public/assets

0

对我来说,疑难杂症是

config.assets.debug = true 

选项。

+0

你是什么意思?我遇到这个问题,并且在我的development.rb中也有这一行。我应该删除它吗? – Blake

+1

事实上,我发现它与“尝试和错误”的方法,因为我在Firebug中看到,JavaScript被加载了两次,因此绑定被做了两次(导致多余的ajax调用)。无论如何,我怀疑这是因为我在本地预编译了资产(因为部署到heroku)并结合debug = true。无论如何,当我设置了'config.assets.debug = false'时,它不再包含两次。 – Beffa

+0

感谢您的回复。事实证明,我的问题也是该脚本加载两次。我四处移动dom元素,导致我的脚本重新运行。我通过在window.onload事件触发后运行脚本来修复它。 – Blake

相关问题