You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 5中使用will_paginate实现加载更多按钮时重复加载问题求助

这种重复加载的情况真的挺闹心的,我之前也碰到过类似的问题,大概率是这几个地方出了问题,咱们一步步排查解决:

1. 事件绑定重复触发请求

最常见的原因就是加载更多按钮的点击事件被重复绑定了,比如每次加载完新内容后,脚本又重新绑定了一次点击事件,导致点击一次触发两次AJAX请求。

解决方法:

确保事件只绑定一次,比如在你的pagination.js.coffee里,先移除旧的绑定再重新绑定,同时别忘了阻止默认行为:

$(document).on 'turbolinks:load', ->
  # 先移除之前的绑定,避免重复触发
  $(document).off('click', '.load-more').on('click', '.load-more', (e) ->
    e.preventDefault() # 阻止a标签默认跳转行为
    $button = $(this)
    next_page = $button.data('page')

    $.ajax
      url: '/links'
      data: { page: next_page }
      type: 'GET'
      dataType: 'script'
      beforeSend: ->
        $button.text('加载中...').prop('disabled', true)
      complete: ->
        $button.text('加载更多').prop('disabled', false)
  )

注:用turbolinks:load代替$ ->,适配Rails 5默认的Turbolinks,避免页面缓存导致脚本重复执行

2. index.js.erb里重复渲染内容

检查你的index.js.erb,是不是不小心写了两次append逻辑?比如重复调用了$('.links-container').append(...),导致返回的内容被添加两次。

正确的index.js.erb示例:

# 只append一次新内容,建议用partial渲染更清晰
$('.links-container').append('<%= j render partial: 'links/link', collection: @links %>');

# 更新下一页页码或移除按钮
<% if @links.next_page %>
  $('.load-more').data('page', <%= @links.next_page %>);
<% else %>
  $('.load-more').fadeOut().remove();
<% end %>

3. 控制器分页逻辑错误

检查你的links_controller.rb(你写的links_controller.erb应该是笔误),是不是@links的分页参数没正确获取,导致每次请求都返回同一页内容?

正确的控制器index动作:

class LinksController < ApplicationController
  def index
    # 确保分页参数正确,且排序稳定避免重复
    @links = Link.order(created_at: :desc).paginate(page: params[:page], per_page: 3)
    respond_to do |format|
      format.html
      format.js
    end
  end
end

4. 排查小技巧

打开浏览器开发者工具的Network标签,点击加载更多按钮:

  • 如果看到两次相同的AJAX请求:那就是事件重复绑定或请求被重复触发的问题
  • 如果只有一次请求,但返回的内容里有重复记录:那是控制器分页逻辑的问题
  • 如果请求返回内容正常,但页面上显示两次:那是index.js.erb的append逻辑重复了

内容的提问来源于stack exchange,提问作者bigLdot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:01:47