Почему Rails UJS ajax: успешное связывание вызывается дважды? - PullRequest
5 голосов
/ 29 августа 2011

У меня есть простая форма:

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

9 голосов
/ 21 октября 2011

Это связано с тем, что ваша страница загружает код jquery_ujs дважды в режиме разработки, когда в /public/assets.

существуют предварительно скомпилированные ресурсы. В режиме разработки заявки на JavaScript загружаются с отдельными тегами: jquery, jquery_ujs.js, myscripts.js и наконец applications.js.Проблема возникает, когда существует предварительно скомпилированный application.js, который используется с /public/assets - он содержит компиляцию всех предыдущих файлов.Это запускается граблями assets:precompile.

Решение состоит в том, чтобы удалить каталог /public/assets при разработке, после чего используется application.js (из /app/assets/javascript), который не включает предыдущие файлы.Обычно не использует assets:precompile грабли в разработке.

Обновление

Добавление config.serve_static_assets = false в development.rb также решает проблему, не беспокоясь о /public/assets.

5 голосов
/ 05 сентября 2011

Подобное произошло со мной при обновлении приложения с 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, но в этом больше нет необходимости

0 голосов
/ 18 сентября 2012

Для меня Гоча была

config.assets.debug = true

опция.

...