Rails 7.1.3.2中link_to指定DELETE方法仍执行GET请求问题
我在使用Devise认证gem实现登出功能时,试了两种写法:
第一种:
<%= link_to "Sign Out", destroy_user_session_path, method: :delete %>
第二种:
<%= link_to "Logout2", destroy_auth_user_session_path, data: { turbo_method: :delete, turbo_confirm: "Are you sure?" } %>
但不管哪种写法,最终触发的都是GET请求,不是预期的DELETE请求。当前使用的是Rails 7.1.3.2,看过官方文档里删除文章的示例,也查过类似问题但都没解决。
请求记录截图:
排查与解决步骤
确认Turbo加载正常
Rails 7默认用Turbo处理非GET请求,先检查application.js里有没有导入Turbo:import "@hotwired/turbo-rails"再看
application.html.erb里是否包含<%= javascript_importmap_tags %>,确保Turbo能正常加载运行。核对Devise路由
运行rails routes命令,查看登出路由的HTTP方法是否为DELETE。正常的Devise登出路由应该是这样:DELETE /users/sign_out(.:format) users/sessions#destroy如果显示的是GET,检查
config/routes.rb里的Devise声明是否正确,比如:devise_for :users避免UJS与Turbo冲突
Rails 7已经弃用了旧的rails-ujs,如果你的项目里还在加载它,会和Turbo冲突导致method: :delete失效。确保没有同时加载两者,优先用Turbo的data-turbo-method属性。清除浏览器缓存
浏览器缓存可能导致旧的JS文件没更新,强制刷新页面(Ctrl+F5)或者清除缓存后再测试。确认路由路径正确
检查destroy_user_session_path或destroy_auth_user_session_path是不是对应正确的登出路由,通过rails routes确认路径名称,别写错了。检查控制台JS错误
打开浏览器开发者工具(F12),查看Console面板有没有JS报错。Turbo加载失败或者其他JS异常,都会导致无法处理DELETE请求。
内容的提问来源于stack exchange,提问作者Adam

