Подтвердить что ты не робот

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

4b9b3361

Ответ 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