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

Rails中pagy gem结合turbo frame删除记录后分页URL生成异常

问题:Turbo Stream删除记录后Pagy分页链接路径异常

我在应用中使用pagy gem实现分页,同时用turbo frames完成交互式CRUD操作。删除记录时,通过turbo_stream.erb动作更新分页和列表项框架,除分页链接外一切功能正常。

预期分页链接应为:

/toponyms?page=1
/toponyms?page=2 

但删除ID为278的记录后,分页链接变为:

# 因为删除了ID为278的记录
/toponyms278?page=1
/toponyms278?page=2

相关代码

控制器代码

def destroy
    authorize @toponym
    @toponym.destroy
    flash[:info] = "Toponym was successfully destroyed."
    
    # 这里必须重新获取分页数据,确保删除后分页更新
    @pagy, @toponyms = pagy(Toponym.order(created_at: :desc))
    puts @pagy
    respond_to do |format|
      format.turbo_stream
      format.html { redirect_to toponyms_url, notice: "Toponym was successfully destroyed." }
      format.json { head :no_content }
    end
  end

destroy.turbo_stream.erb代码

<%= turbo_stream.update "total" do %>
    <%== pagy_nav(@pagy) %>
    <%== pagy_info(@pagy) %>
<% end %>

解决方案

问题出在pagy生成链接时的路径来源:删除操作的请求路径是/toponyms/278,pagy默认会基于当前请求路径生成分页链接,导致把记录ID错误地拼接到了路径中。

可以通过两种方式修正:

方法1:初始化pagy时指定基础路径

修改控制器中pagy的初始化代码,添加url: toponyms_url参数,强制pagy使用列表页的路径作为分页链接的基础:

@pagy, @toponyms = pagy(Toponym.order(created_at: :desc), url: toponyms_url)

方法2:在模板中调用pagy_nav时指定路径

如果不想修改控制器,也可以在erb模板里给pagy_nav传入url参数:

<%== pagy_nav(@pagy, url: toponyms_url) %>

两种方法都能让分页链接回到预期的/toponyms?page=X格式。

内容的提问来源于stack exchange,提问作者Sercan Tırnavalı

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:50:13