【问题标题】:Rails AJAX request is returned 5 times instead of oneRails AJAX 请求返回 5 次而不是 1 次
【发布时间】:2011-03-19 18:01:34
【问题描述】:

我正在尝试使用 link_to :remote 选项执行简单的 AJAX 请求并动态显示响应。问题是我得到 5 个响应而不是 1 个。为什么会发生这种情况?

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、回形针和 simple_form。将 :confirm 与 link_to 一起使用时,我也遇到了类似的问题。问题是,无论您按什么,此确认对话框都会显示 5 次。

在生成的 html 中只有一个带有 'sortable' id 的项目:

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

【问题讨论】:

  • 你说收到 5 条回复是什么意思?
  • 你使用哪个 JS 框架?是 jQuery 吗?一个请求不可能得到 5 个响应,我猜也有 5 个请求,请检查一下。
  • 这样的问题通常是事件冒泡的结果。确保在发出请求后单击您的链接停止冒泡。
  • 您是否拥有多个 ID 为“可排序”的对象?
  • HTML 中只有一个 'sortable' id:

标签: ruby-on-rails ruby ajax


【解决方案1】:

您在使用不同的链接时遇到了这个问题,对吧?

您的链接处理程序已注册多次(您可以通过使用 firefox 中的 firebug 或 chrome 中的开发人员工具轻松检查,只需单击链接并查看发送了多少请求,或 console.log 处理程序)

如果您动态注册远程链接(例如,在异步页面片段加载之后)并且最简单的解决方法是将您的链接标记为已注册(例如,通过添加“注册”类)而不注册,则可能会发生这种情况又是这样的

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

如果您自己没有在 jQuery 中编写任何单击事件处理程序,请检查为您编写的库。寻找类似的东西:

$(document).ajaxComplete(function() {
  $('a[data-remote="true"]').click(function() {
    #some code here...
  });
});

【讨论】:

    【解决方案2】:

    谢谢!情况差不多就是这样。我检查了代码,这是导致该行为的问题:

    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”和“应用程序”脚本与其他所有 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 请求,以及多次显示的 :confirm 对话框。

    还学习了如何使用 Firebug 进行 AJAX 调试:D 谢谢!

    【讨论】:

      【解决方案3】:

      我在使用资产管道时遇到了同样的问题。 assets:precompile 将所有 js 文件的内容复制到 application.js 中,当您现在在浏览器中打开页面并且 application.js 文件被缓存,并在开发人员中重新启动时,浏览器将加载 application.jsjquery_ujs.js 文件同时进行。所以同时注册了2个remote handler。

      清理浏览器缓存是我的解决方案。 (也许这会帮助其他一些遇到类似问题的人)

      【讨论】:

        猜你喜欢
        • 2020-11-12
        • 1970-01-01
        • 1970-01-01
        • 2023-02-09
        • 1970-01-01
        • 2022-12-16
        • 1970-01-01
        • 1970-01-01
        • 2018-02-24
        相关资源
        最近更新 更多