Rails 7禁用Turbo后Delete方法失效跳转show页面怎么办
问题根因
Rails 7 默认使用 Turbo Drive 替代旧版 rails-ujs 处理非GET请求链接、确认弹窗这类交互。给删除链接添加 turbo: false 禁用Turbo后,没有对应依赖处理 method: :delete 和 confirm 配置,浏览器会将该链接识别为普通GET请求,直接匹配GET /friends/:id路由进入show动作,因此始终跳转show页面,不会触发删除逻辑。
同时现有控制器代码存在逻辑错误,会导致删除流程异常。
解决方案
按以下步骤排查修复即可:
- 补全非GET请求的处理依赖
Rails 7 新建项目默认未内置rails-ujs,禁用Turbo后需要手动引入该依赖处理带method配置的链接:- 如果是importmap管理前端依赖的项目,执行命令安装包:
如果是esbuild/webpack等jsbundling方案的项目,执行:bin/importmap pin @rails/ujsyarn add @rails/ujs - 在
app/javascript/application.js中添加启动代码:import Rails from '@rails/ujs' Rails.start()
link_to换成button_to,服务端会自动生成带隐藏method字段的表单,原生支持非GET请求,无需JS依赖即可正常触发DELETE请求,写法参考:<td> <%= button_to 'Delete', friend_path(friend), method: :delete, data: { confirm: 'Are you sure?' }, class: "btn btn-danger" %> </td> - 如果是importmap管理前端依赖的项目,执行命令安装包:
- 修复控制器destroy方法的逻辑错误
现有代码连续调用了两次@friend.destroy,第一次调用就已经完成数据删除,第二次调用永远返回false,会导致流程走到异常分支。修改为正确的单次判断即可,调试用的debugger调试完成后记得删除:def destroy @friend = Friend.find(params[:id]) if @friend.destroy redirect_to friends_path, notice: "Deleted Successfully!!!" else render :index, status: :unprocessable_entity end end - 验证修复结果
改完后重启Rails服务,刷新页面点击删除按钮,会先弹出确认提示,确认后正常执行删除逻辑,跳转回friends列表页。
注意:修改前端依赖配置后必须重启Rails服务,否则新引入的JS资源不会被正常加载。
内容的提问来源于stack exchange,提问作者MHZ GAMER
相关产品推荐
相关产品推荐

