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

Rails7中TurboFrame内带data-turbo=false的删除链接无法触发DELETE请求

Rails 7禁用Turbo后删除链接发GET而非DELETE请求的问题解析

问题场景

删除链接位于turbo_frame内,使用以下代码时,点击后确认框不弹出,请求为GET,控制器的destroy动作未触发:

<%= link_to t("delete"), post_path(post), method: :delete, class: "font-medium text-red-600 underline hover:no-underline hover:text-red-500", data: { confirm: t("are_you_sure") , turbo: false } %>

改用以下代码可正常触发DELETE请求和确认框,但需要实现完整页面重定向到posts_path:

<%= link_to t("delete"), post, method: :delete, class: "font-medium text-red-600 underline hover:no-underline hover:text-red-500", data: { turbo_confirm: t("are_you_sure"), turbo_method: :delete } %>

控制器destroy方法代码:

def destroy
  @post.destroy

  respond_to do |format|
    format.html { redirect_to posts_url, status: :see_other }
  end
end

原因分析

Rails 7默认用Turbo替代了传统的UJS(Unobtrusive JavaScript):

  • 当给link_to加上data: { turbo: false }时,会绕过Turbo的请求处理逻辑
  • 传统的method: :delete和data: { confirm: ... }依赖UJS来将原生GET请求转换为DELETE请求、触发确认框
  • 如果项目未引入UJS,禁用Turbo后,这些UJS负责的功能全部失效,链接只能发起原生GET请求

解决方案

方案1:引入Rails UJS,保留禁用Turbo的写法

在app/javascript/application.js中添加UJS引入:

import "@rails/ujs"

引入后,原来的链接代码即可正常工作:

  • data: { confirm: ... }会触发确认框
  • method: :delete会被UJS转换为DELETE请求
  • 控制器的重定向会触发完整页面跳转(因为Turbo已禁用)

方案2:保留Turbo,实现全页面重定向

无需引入UJS,修改链接参数,指定Turbo操作整个页面框架:

<%= link_to t("delete"), post, method: :delete, class: "font-medium text-red-600 underline hover:no-underline hover:text-red-500", data: { turbo_confirm: t("are_you_sure"), turbo_method: :delete, turbo_frame: "_top" } %>
  • turbo_frame: "_top"指定Turbo操作整个页面,而非当前turbo_frame内部
  • 确认框和DELETE请求由Turbo处理,控制器重定向后会触发完整页面跳转

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:33:24