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支持的配置:
解决步骤
- 修改
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> - 确认Turbo已加载:检查
app/javascript/application.js是否包含Turbo导入,没有则添加:
添加后重启服务器。import "@hotwired/turbo-rails"
为什么详情页按钮正常?
详情页的<button type="submit">属于表单提交,表单由Rails助手生成时会自动添加DELETE请求的隐藏字段,Turbo能正常处理表单的DELETE请求,因此不受影响。
问题2:Devise登出按钮触发GET请求报错
同样是Turbo与Devise的适配问题,需调整登出链接的属性:
解决步骤
- 修改登出链接的data属性:
<li class="nav-item"> <%= link_to "Sign out", destroy_user_session_path, data: { turbo_method: :delete }, class:"nav-link"%> </li> - 可选:配置Devise兼容Turbo:若仍有问题,在
config/initializers/devise.rb中添加:
确保Devise能响应Turbo的请求格式。config.navigational_formats = ['*/*', :html, :turbo_stream]
备选方案:重新引入jQuery UJS(不推荐)
如果需要兼容旧代码,可手动引入UJS,但Turbo与UJS可能存在冲突:
- 安装依赖:
yarn add rails-ujs - 在
app/javascript/application.js中导入并启动:import Rails from 'rails-ujs' Rails.start()
验证步骤
- 重启Rails服务器
- 清除浏览器缓存(避免旧JS缓存干扰)
- 测试删除和登出按钮,确认请求方法为DELETE
内容的提问来源于stack exchange,提问作者Dan Easton
相关产品推荐
相关产品推荐

