Rails 3 UJS - контроллер вызывается дважды по link_to: remote - PullRequest
33 голосов
/ 20 ноября 2010

У меня странная проблема, когда 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-содержимое ' ... тем же 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-запроса.

Может кто-нибудь увидеть, что здесь не так?

Я использую гем 'jquery-rails', который копирует последний файл jquery-ujs в мое приложение.Версия JQuery 1.4.3

Ответы [ 11 ]

26 голосов
/ 15 октября 2011

Благодаря этому диалогу:

https://github.com/rails/jquery-ujs/issues/208

Мне удалось обнаружить, что jquery и jquery_ujs были включены дважды.

Полагаю, гем jquery-rails автоматически помещает их в application.js, а затем я включил их и в application.js.

По какой-то причине похоже, что application.js автоматически связывает все в app / assets / javascripts / - даже когда я удаляю все требуемые.

Итак, если ваши: remote => true формы отправляются дважды, попробуйте проверить application.js.

Надеюсь, это поможет!

ОБНОВЛЕНИЕ: Я полагаю, что это могло иметь какое-то отношение к тому, что я предварительно рендерил свои активы без использования дайджеста, поэтому, когда моя среда разработки динамически добавляет теги сценария в заголовок html из требований в app / assets / application. js, он также добавляет один для того, что должно быть пустым динамическим application.js, за исключением того, что загружается статический из public / assets. Смешение? Да!

17 голосов
/ 19 ноября 2011

У меня была та же проблема, исправленная комментарием этой строки

\#config.assets.debug = true

в режиме разработки

5 голосов
/ 17 мая 2013

У меня была симилиарная проблема. Выполнение следующих граблей решило мою проблему.

rake tmp:clear
rake assets:clean
3 голосов
/ 20 ноября 2010

Я думаю, что ваш JavaScript не мешает выполнению ссылки браузером.Таким образом, вы получаете запрос AJAX, а затем запрос браузера.

Существует объяснение и решение для этого в Rails Cast 174. Текстовое объяснение здесь , примерно на 3/4 страницы вниз.

2 голосов
/ 05 июня 2012

У меня была та же проблема: дублированные запросы при использовании: remote => true.Моя проблема была связана с использованием Heroku и прекомпиляцией ресурсов.Я прекомпилирую ресурсы перед развертыванием в Heroku (рейк-активы: прекомпиляция).По сути, это создает дубликат копии вашего конвейера активов в вашей общей папке.То же самое происходило, как упоминал Docunext: было несколько файлов javascript, обрабатывающих каждый запрос.

Это исправляется, если я удаляю ресурсы в публичном каталоге при локальной работе (git rm -rf public / assets),После удаления ресурсов из общедоступного каталога он перестал отправлять несколько запросов

1 голос
/ 13 октября 2015

Также для меня такая же проблема: дважды XMLHttpRequest на link_to ...: remote => "true"

Я решил, в

locals / application.rb :

комментируя

// config.assets.paths << Rails.root.join («поставщик», «активы», «таблицы стилей», «JavaScript») </strong>

и раскомментировать

config.action_view.javascript_expansions [: defaults] =% w (приложение jquery jquery-ui)

тогда я забыл сделать после последнего git pull. Я надеюсь помочь кому-нибудь.

1 голос
/ 25 апреля 2012

Попробуйте этот код .... для предотвращения двойного щелчка по удаленным ссылкам ..

$('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 1005 *

0 голосов
/ 19 июля 2015

Опираясь на ответ Юджина, обратите внимание, что если вы разрабатываете после локальной компиляции своих ресурсов для производства, например ...

bundle exec rake assets:precompile RAILS_ENV=production

... затем продолжите разработку Rails AssetPipelineзахочет обслуживать и ваши некомпилированные и ваши скомпилированные активы.

Один из способов исправить это - стандартное задание рейка Юджина.Другой способ - просто удалить эти надоедливые предварительно скомпилированные готовые к работе активы с чем-то вроде

$ rm -rf #{Rails.root}/public/assets
0 голосов
/ 21 ноября 2013

Если вы не можете узнать, где файл 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!');
}
0 голосов
/ 10 октября 2012

Я столкнулся с той же проблемой только сейчас.проверил все изменения кода и пробовал другие вещи, но безрезультатно.окончательно очистил кеш браузера.это помогло.

...