【问题标题】:Rails returning several duplicate records when using AjaxRails 在使用 Ajax 时返回多个重复记录
【发布时间】:2014-08-30 00:07:48
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    要调试这个问题,你真的要看看是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
    

    【讨论】:

    • 我已经用正确的respond_to 格式设置了控制器方法,我在答案中使用了你提供的脚本,但我们仍然收到相同的 2 个请求,我相信我们有Jquery 库仅在我们的应用程序中加载一次,我们没有启用 turbolinks。我已经使用这种技术进行无限滚动,并且从未遇到过这样的错误。还有其他想法吗?谢谢。
    • 没问题 - 您是否专门查看了请求(即发送了什么?)另一件事是在它调用的函数时定义一个警报 - 让您查看它是否是函数被调用了两次
    • 奇怪的是,当我使用alert 时,该功能只触发一次,所以基本上我每次页面加载都有一个请求,不再有双重请求。对此有什么想法吗?
    • 顺便说一句。我在 if 语句之后直接添加了警报并使用您的脚本
    • 谢谢@RichPeck,这里的任何帮助都会很棒!
    【解决方案2】:

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

    【讨论】:

    • 谢谢@iouri,这个问题是我不想替换现有结果,而是在现有结果下方添加新结果作为滚动。您的方法解决了重复问题,但也删除了先前的结果,在我们的例子中,我们希望显示任何给定查询的全部结果。
    • 我认为我们在 IRC 中发现了问题,滚动多次触发,因此它在最后一次请求完成加载之前收到了对同一页面的请求。建议是添加某种逻辑切换以暂停处理,直到 index.js.erb 完成加载,然后在完成后再次启用它。也许使用 loader hidden 作为标志来加载/不加载下一页等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    相关资源
    最近更新 更多