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

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配置的链接:
    1. 如果是importmap管理前端依赖的项目,执行命令安装包:
      bin/importmap pin @rails/ujs
      
      如果是esbuild/webpack等jsbundling方案的项目,执行:
      yarn add @rails/ujs
      
    2. 在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>
    
  • 修复控制器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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:31:01