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
相关产品推荐
相关产品推荐

