Rails AJAX请求返回5次而不是一次

时间:2011-03-19 18:01:35

标签: ruby-on-rails ruby ajax

我正在尝试使用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,paperclip和simple_form。使用时我也有类似的问题:用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> 

3 个答案:

答案 0 :(得分:3)

你有不同链接的这个问题,对吗?

您的链接处理程序已多次注册(您可以通过在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...
  });
});

答案 1 :(得分:0)

谢谢!几乎就是这种情况。我检查了代码,这是导致该行为的问题:

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

答案 2 :(得分:0)

使用资产管道时遇到了同样的问题。 assets:precompile将所有js文件的内容复制到application.js中,当您现在在浏览器中打开页面并缓存application.js文件,然后在developpent中重新开始时,浏览器将加载{同时{1}}和application.js文件。因此,同时注册了2个远程处理程序。

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