Rails 7中DELETE请求被识别为GET的路由错误求助
Rails DELETE请求被识别为GET的路由错误排查
错误信息
No route matches [GET] "/home/delete_operation/1"
相关配置代码
视图(ERB)
<%= link_to 'Delete operation', home_delete_operation_path(id: operation.id), method: :delete, data: { confirm: 'Are you sure?', turbo: false }, class: "btn btn-dark btn-sm rounded-0" %>
控制器(HomeController)
def delete_operation @operation = Operation.find(params[:id]) @operation.destroy end
路由(routes.rb)
delete 'home/delete_operation/:id', to: 'home#delete_operation', as: :home_delete_operation
Application.js
// Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails import "@hotwired/turbo-rails" import "controllers" //= require jquery3 //= require popper //= require bootstrap-sprockets //= require jquery_ujs //= require chartkick //= require Chart.bundle import "chartkick" import "Chart.bundle"
排查与解决方法
调整JS加载顺序:
你当前混用了Importmap和Sprockets语法,jquery_ujs必须在Turbo之前加载。Turbo会接管页面请求处理,晚于jquery_ujs加载才能让jquery_ujs正常处理method: :delete的链接。修改Application.js://= require jquery3 //= require popper //= require bootstrap-sprockets //= require jquery_ujs import "@hotwired/turbo-rails" import "controllers" //= require chartkick //= require Chart.bundle import "chartkick" import "Chart.bundle"检查前端依赖加载状态:
打开浏览器开发者工具,查看Console是否有jQuery或jquery_ujs相关报错,再到Network标签确认jquery_ujs.js是否成功加载。如果加载失败,检查importmap.rb或assets配置是否正确引入了依赖。验证链接生成的HTML属性:
查看页面源码,确认生成的<a>标签包含data-method="delete"属性——这是jquery_ujs将GET请求转为DELETE的核心标识。如果没有这个属性,说明link_to的method: :delete参数没有生效,可能是JS依赖未正确加载。改用button_to(无JS依赖方案):
如果不想纠结JS加载问题,直接用button_to替代link_to,它会生成一个隐藏表单来发送DELETE请求,不需要依赖jquery_ujs或Turbo:<%= button_to 'Delete operation', home_delete_operation_path(id: operation.id), method: :delete, data: { confirm: 'Are you sure?' }, class: "btn btn-dark btn-sm rounded-0" %>
内容的提问来源于stack exchange,提问作者TEJINDER SINGH
相关产品推荐
相关产品推荐

