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

时间:2014-08-30 00:07:49

标签: jquery ruby-on-rails ajax ruby-on-rails-4

所以,我有一个应用程序,有几个电影剪辑,用户可以搜索特定主题等...我正在使用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()

这是截屏Example

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

谢谢!

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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


<强> JS

如果这是一个JS问题,那么您可能会遇到两个潜在问题:

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

首先,我会确保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

答案 1 :(得分:0)

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