为什么Rails UJS是ajax:成功绑定被调用两次?

时间:2011-08-29 02:47:14

标签: ajax ruby-on-rails-3.1 ujs

我有一个简单的表格:

= 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。

3 个答案:

答案 0 :(得分:9)

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

在开发模式下,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 = false添加到development.rb也解决了我的问题,而不必担心/public/assets

答案 1 :(得分: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生成的,但不再需要了

答案 2 :(得分:0)

对我来说,问题是

config.assets.debug = true

选项。