Rails AJAX-запрос возвращается 5 раз вместо одного - PullRequest
5 голосов
/ 19 марта 2011

Я пытаюсь выполнить простой AJAX-запрос, используя опцию link_to: remote, и отобразить ответ динамически. Проблема в том, что я получаю 5 ответов вместо одного. Почему это может происходить?

page.html.erb:

<%= link_to item.title, item_path(item, :format => :js), :remote => true %>

show.js.erb:

$("<%= escape_javascript render(:file => 'items/show.html.erb') %>").insertAfter('#sortable');
$('#show_item').slideDown();

items_controller.rb:

def show
        @item = Item.find(params[:id])
        respond_to do |format|
            format.html
            format.js
        end
    end

Обновление: я использую jQuery. Gemset включает Devise, paperclip и simple_form. У меня также похожая проблема при использовании: подтвердите с link_to. Дело в том, что это диалоговое окно подтверждения отображается 5 раз, независимо от того, что вы нажимаете.

В сгенерированном html есть только один элемент с «сортируемым» идентификатором:

<ul id="sortable"> 
        <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span><a href="/items/10.js" data-remote="true">Another item</a></li> 
        <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span><a href="/items/9.js" data-remote="true">test</a></li> 
     </ul> 

Ответы [ 3 ]

3 голосов
/ 21 марта 2011

У вас возникла эта проблема с разными ссылками, верно?

Ваш обработчик ссылок был зарегистрирован несколько раз (вы можете легко проверить это, используя firebug в Firefox или инструменты разработчика в Chrome, просто нажмите на ссылку ипосмотрите, сколько запросов отправлено, или console.log - обработчик)

Это может произойти, если вы регистрируете удаленные ссылки динамически (например, после асинхронной загрузки фрагмента страницы), и самое простое решение - этопометьте вашу ссылку как зарегистрированную (например, добавив класс 'зарегистрированный') и не регистрируйте ее снова, например

# Link registration
$('a.my_link:not(.registered)').click(function(e) {
  #your code here
}).addClass('registered');

Если вы сами не написали обработчики событий click в jQuery, проверьте наличие библиотекделаю это для вас.Ищите что-то вроде:

$(document).ajaxComplete(function() {
  $('a[data-remote="true"]').click(function() {
    #some code here...
  });
});
0 голосов
/ 09 августа 2012

У меня была такая же проблема при использовании конвейера ресурсов. assets:precompile копирует содержимое всех js-файлов в application.js, когда вы теперь открываете страницу в браузере и файл application.js кэшируется и снова запускается в проявке, браузер загрузит application.js и jquery_ujs.js файл одновременно. Таким образом, одновременно зарегистрированы 2 удаленных обработчика.

Очистка кеша браузера была решением для меня. (Maby это поможет некоторым другим, сталкивающимся с подобными проблемами)

0 голосов
/ 22 марта 2011

Спасибо! Это было в значительной степени так. Я проверил код, и вот проблема, вызывающая такое поведение:

application.html.erb

 <%= javascript_include_tag 'jquery-1.4.4.min', 'rails', 'application' %>
  <%= javascript_include_tag 'jquery-ui-1.8.9.custom.min', 'rails', 'application' %>
  <%= javascript_include_tag 'jquery.prettyPhoto', 'rails', 'application' %>
  <%= javascript_include_tag 'jquery.fancybox-1.3.4.pack', 'rails', 'application' %>
  <%= javascript_include_tag 'placeholder', 'rails', 'application' %>

Дело в том, что я включаю сюда скрипты 'rails' и 'application' во все остальные файлы js Вот исправление:

  <%= javascript_include_tag 'jquery-1.4.4.min', 'rails', 'application' %>
  <%= javascript_include_tag 'jquery-ui-1.8.9.custom.min' %>
  <%= javascript_include_tag 'jquery.prettyPhoto' %>
  <%= javascript_include_tag 'jquery.fancybox-1.3.4.pack' %>
  <%= javascript_include_tag 'placeholder' %>

Удаление разрешенных множественных запросов AJAX GET, а также: подтверждение диалогов, отображаемых несколько раз.

Также узнал, как использовать Firebug для отладки AJAX: D Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...