Rails 3 UJS - контроллер дважды вызывается вызовом link_to: remote
У меня есть странная проблема, когда JQuery создает два запроса AJAX для метода link_to. Я разрабатываю приложение Rails 3 с JQuery для UJS. У меня есть ссылка переключения, которая переключает между "Follow" и "Unfollow"
Моя ссылка отображается следующим образом:
<span id="follow_link">
<a href="/tfollow_artist?id=8103103" data-method="post" data-remote="true" id="follow_artist" rel="nofollow">Unfollow</a>
</span>
и мой контроллер настроен так:
def tfollow_artist
@artist = Artist.find(params[:id])
if current_user.following?(@artist)
current_user.stop_following(@artist)
else
current_user.follow(@artist)
end
end
который, наконец, отображает js как:
$('#follow_link').html('<%= escape_javascript(render :partial => "follow") %>');
Что существенно заменяет html-содержимое "< span id =" follow_link " > ... </span> с тем же URL-адресом только с другим текстом. Например, выше будет отображаться как:
<span id="follow_link">
<a href="/tfollow_artist?id=8103103" data-method="post" data-remote="true" id="follow_artist" rel="nofollow">Follow</a>
</span>
Однако это как-то заставляет JQuery делать два запроса AJAX.
Может ли кто-нибудь увидеть, что здесь не так?
Я использую gem jquery-rails, который копирует последний файл jquery-ujs в мое приложение. Версия JQuery - 1.4.3
Ответы
Ответ 1
Благодаря этому диалоговому окну:
https://github.com/rails/jquery-ujs/issues/208
Мне удалось обнаружить, что jquery и jquery_ujs включались дважды.
Я думаю, что jquery-rails gem автоматически помещает их в application.js, а затем я включил их в application.js.
Похоже, по какой-то причине application.js автоматически связывает все в app/assets/javascripts/- даже когда я удаляю все требуемые.
Итак, если ваши: remote = > true формы отправляются дважды, попробуйте проверить application.js.
Надеюсь, это поможет!
UPDATE: Я полагаю, что это могло иметь какое-то отношение ко мне для предварительного рендеринга моих активов без использования дайджеста, поэтому, когда моя среда разработки добавляет теги script в html-head динамически из требований в app/assets/application.js, он также добавляет один для того, что должно быть пустым динамическим application.js, за исключением того, что статический из public/assets загружается. Смешение? Да!
Ответ 2
У меня была та же проблема, исправленная путем комментирования этой строки
\#config.assets.debug = true
в режиме разработки
Ответ 3
У меня была близкая проблема. Выполнение следующих задач rake разрешило мою проблему.
rake tmp:clear
rake assets:clean
Ответ 4
Я думаю, что происходит то, что ваш JavaScript не останавливает связь с исполняемым браузером. Таким образом, вы получаете запрос AJAX, а затем запрос браузера.
Есть объяснение и решение для этого в Rails Cast 174. Текстовое объяснение здесь, примерно на 3/4 страницы вниз.
Ответ 5
У меня была такая же проблема: дублировать запросы при использовании: remote = > true. Моя проблема была связана с использованием Heroku и предварительной компиляции активов. Я предварительно накапливаю активы до развертывания в Heroku (rake assets: precompile). Это по существу создает дублирующую копию конвейера вашего ресурса в вашей общей папке. То же самое происходило, как упоминалось в Docunext: было несколько файлов javascript, обрабатывающих каждый запрос.
Он фиксируется, если я удаляю активы в общедоступном каталоге при работе локально (git rm -rf public/assets). После удаления активов из общего каталога он прекратил отправку нескольких запросов
Ответ 6
Попробуйте этот код.... для предотвращения двойных щелчков по удаленным ссылкам.
$('a[data-remote=true]').live('ajax:before', function () {
if ($(this).attr('ajax-loading')) {
return false;
} else {
$(this).attr('ajax-loading', true);
}
}).live('ajax:complete', function () {
$(this).removeAttr('ajax-loading');
});
Gist
Ответ 7
Также для меня та же проблема: дважды XMLHttpRequest на
link_to...: remote = > "true"
Я решил, в
locals/application.rb:
комментируя
//config.assets.paths < < Rails.root.join( 'поставщик', 'активы', 'таблицы стилей', 'JavaScripts')
и uncomment
config.action_view.javascript_expansions [: defaults] =% w (приложение jquery jquery-ui)
то я забыл сделать после моего последнего git pull.
Я надеюсь помочь кому-то.
Ответ 8
Файлы JavaScript, которые вы хотите использовать как: defaults (application.js всегда включается).
config.action_view.javascript_expansions[:defaults] = %w(jquery rails)
В ответной строке четко сказано, что приложение application.js всегда включено.
В моем приложении я добавил приложение по умолчанию. Поэтому для ajax.submit он создавал две записи в моем приложении.
Ответ 9
я столкнулся с той же проблемой только сейчас. проверил все изменения кода и попробовал другие вещи, но безрезультатно. наконец, очистил кеш браузера. что помогло.
Ответ 10
Если вы не можете узнать, где дважды загружается файл ujs, просто скопируйте этот код в rails.js/application.js(желательно не здесь)
var alreadyInitialized = function() {
var events = $(document).data('events');
return events.click && $.grep(events.click, function(e) { return e.namespace === 'rails'; }).length;
}
if ( alreadyInitialized() ) {
$.error('jquery-ujs has already been loaded!');
}
Ответ 11
Основываясь на ответе Евгения, обратите внимание, что если вы разрабатываете после того, как вы локально предварительно скомпилировали свои активы для производства, например...
bundle exec rake assets:precompile RAILS_ENV=production
... тогда по мере продолжения разработки Rails AssetPipeline захочет обслуживать как ваши несвязанные, так и ваши скомпилированные активы.
Один из способов исправить это с помощью стандартной грабли Eugene Rails. Другой способ - просто удалить эти досадные предварительно скомпилированные готовые к производству активы с чем-то вроде
$ rm -rf #{Rails.root}/public/assets