Rails在使用Ajax时返回多个重复记录

所以,我有一个应用程序,有几个电影剪辑,用户可以搜索特定主题等…我正在使用Ajax处理分页,以便用户可以进行搜索查询并滚动查看更多结果(类似于推特)。

问题是当用户搜索即“搞笑”时,会出现一堆记录,并且当用户向下滚动时,Ajax将使用新记录加载记录的副本。

这是代码:

if $('.pagination').length $(window).scroll -> url = $('.pagination .next_page').attr('href') if url && $(window).scrollTop() > $(document).height() - $(window).height() - 50 $('.loader').removeClass('hidden') $.getScript(url) $(window).scroll() 

这是一个截图 例

在这种情况下,如何防止rails重复记录? 我尝试过uniq和其他几种方法无济于事。

谢谢!

在这里更新一些可能有助于调试此问题的其他代码:

https://gist.github.com/pblogs/e202ee1f03339ba977ec

要调试此问题,您必须查看它是javascript还是Rails问题

从您的调试中可以看出,您的浏览器向控制器发送了两个单独的请求,这表示您有某种javascript问题。 但是,我之前遇到过Rails发回“多个”响应

解决问题的关键是确定导致问题的原因:


JS

如果这是一个JS问题,那么您将遇到两个潜在的问题:

  1. Turbolinks
  2. 你的脚本开了两次

首先,我会确保Turbolinks在这里没有出现问题:

 #app/assets/javascripts/application.js.coffee #Paginate paginate = -> if $('.pagination').length $(window).scroll -> url = $('.pagination a.next_page').attr('href') if url && $(window).scrollTop() > $(document).height() - $(window).height() - 50 $('.loader').removeClass('hidden') $.getScript(url) $(window).scroll() $(document).on "page:load ready", paginate 

这将确保每次加载时只调用一次调用(它与Turbolinks Hooks绑定 )。 这意味着如果您想确保Turbolinks在部分重新加载页面后不会触发两次,它将会这样做。

其次,您希望确保只调用一次脚本。 具体来说,我会研究这一行:

 if url && $(window).scrollTop() > $(document).height() - $(window).height() - 50 

这决定了脚本何时触发。 您需要确保仅调用一次滚动,此行将确定。

轨道

第二个潜在的关注点是Rails。

如果你向Rails发送请求,你需要意识到,如果像Turbolinks这样的东西阻碍了它可能会发回多个响应

我会确保我的控制器设置如下:

 #app/controllers/your_controller.rb class YourController < ApplicationController def your_action ... respond_to do |format| format.js format.html end end end 

确保替换内容而不是将另一组结果附加到.js.erb中的现有结果中