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

Ruby on Rails中DELETE请求失效问题求助

解决Rails 7中DELETE请求失效的问题

问题根源

Rails 7默认使用Turbo替代了传统的jQuery UJS,原link_to的method: :delete依赖的data-method属性不再被Turbo识别,导致请求被默认转为GET,这是两个问题的共性原因。


问题1:好友列表删除按钮触发GET跳转而非DELETE

你的ERB代码生成的链接带有data-method="delete",但Turbo不处理该属性,需改用Turbo支持的配置:

解决步骤

  1. 修改link_to的data属性:将method: :delete替换为turbo_method: :delete,Turbo会通过data-turbo-method识别请求方法:
    <td><%= link_to 'Delete', friend, data: { turbo_method: :delete, confirm: 'Are you sure?' }, class: "btn btn-outline-danger btn-sm" %></td>
    
  2. 确认Turbo已加载:检查app/javascript/application.js是否包含Turbo导入,没有则添加:
    import "@hotwired/turbo-rails"
    
    添加后重启服务器。

为什么详情页按钮正常?

详情页的<button type="submit">属于表单提交,表单由Rails助手生成时会自动添加DELETE请求的隐藏字段,Turbo能正常处理表单的DELETE请求,因此不受影响。


问题2:Devise登出按钮触发GET请求报错

同样是Turbo与Devise的适配问题,需调整登出链接的属性:

解决步骤

  1. 修改登出链接的data属性:
    <li class="nav-item">
      <%= link_to "Sign out", destroy_user_session_path, data: { turbo_method: :delete }, class:"nav-link"%>
    </li>
    
  2. 可选:配置Devise兼容Turbo:若仍有问题,在config/initializers/devise.rb中添加:
    config.navigational_formats = ['*/*', :html, :turbo_stream]
    
    确保Devise能响应Turbo的请求格式。

备选方案:重新引入jQuery UJS(不推荐)

如果需要兼容旧代码,可手动引入UJS,但Turbo与UJS可能存在冲突:

  1. 安装依赖:
    yarn add rails-ujs
    
  2. 在app/javascript/application.js中导入并启动:
    import Rails from 'rails-ujs'
    Rails.start()
    

验证步骤

  1. 重启Rails服务器
  2. 清除浏览器缓存(避免旧JS缓存干扰)
  3. 测试删除和登出按钮,确认请求方法为DELETE

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:46:20