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

Ruby on Rails:如何实现帖子的上一页/下一页按钮(无gem)

解决分页按钮点击后页面空白的问题

我来帮你排查并修复分页逻辑里的几个关键问题:

1. 先修复控制器的分页参数初始化逻辑

你的set_page私有方法没有被触发!Rails不会自动执行私有方法,必须通过before_action绑定到对应动作上。另外params[:page]是字符串类型,直接使用会导致计算错误,还要处理非法参数的情况:

class LinksController < ApplicationController
  # 确保访问index动作前先初始化分页参数
  before_action :set_page, only: [:index]

  def index
    # 防止page参数为负数,确保分页从0开始
    @page = [@page.to_i, 0].max
    @links = Link.order(created_at: :desc).limit(8).offset(@page * 8)
    # 计算总页数,用于判断是否显示下一页按钮
    @total_pages = (Link.count.to_f / 8).ceil
  end

  private
  def set_page
    # 处理参数为空或非数字的情况,默认设为0
    @page = params[:page].present? ? params[:page].to_i : 0
  end
end

2. 修正视图里的分页链接逻辑

你之前的链接参数是固定值,不是基于当前页面的动态计算,点击下一页时永远传1,而且没有边界判断(比如第一页不该显示上一页)。修改后的视图代码:

<%# 上一页:仅当当前页大于0时显示 %>
<% if @page > 0 %>
  <%= link_to 'Prev Page', links_path(page: @page - 1) %>
<% end %>

<%# 下一页:仅当当前页未到最后一页时显示 %>
<% if @page < @total_pages - 1 %>
  <%= link_to 'Next Page', links_path(page: @page + 1) %>
<% end %>

为什么之前点击下一页会空白?

  • 核心问题是set_page方法没被调用,且params[:page]是字符串类型,直接做乘法会得到错误的offset值(比如字符串"1"*8会变成"11111111",远超你的帖子总数),导致查询不到数据。
  • 另外固定的链接参数无法实现页码的递进,点击下一页永远停留在同一错误页码。

修改后就能正常实现分页:首次加载显示最新8条,点击下一页加载后续内容,到最后一页时下一页按钮自动隐藏,上一页按钮在第一页时也会隐藏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:19:59