Rails报错No route matches [GET] "/users/sign_out.user"解决方法
问题成因
报错核心原因有两点:
- 非GET请求的链接处理脚本未加载。Rails中
link_to添加的method: :delete参数不是浏览器原生支持的属性,需要依赖内置的前端脚本(rails-ujs 或 Turbo)拦截链接点击事件,自动构造对应方法的请求发送。你贴出的头部布局代码中仅引入了样式表资源,没有引入对应JavaScript包,脚本未生效时浏览器会按照默认行为对链接发起GET请求,自然无法匹配仅接受DELETE方法的登出路由。 - 请求路径出现
.user后缀是路由匹配失败时的连带异常:GET请求无法匹配DELETE类型的登出路由时,Rails路由解析器会误将请求判定为获取sign_out资源的user格式响应,才会出现带.user后缀的路径报错,不是路径辅助方法本身写错了。
修复步骤
- 补全布局文件head区域的JavaScript引入标签,和已有的样式表标签放在同级位置:
- 如果你使用Rails 6及更早版本、或者Rails7使用jsbundling方案,添加如下标签:
= javascript_include_tag "application", "data-turbolinks-track": "reload", defer: true- 如果你使用Rails 7+默认的Importmap方案,添加如下标签:
= javascript_importmap_tags - 确认JS包依赖引入正确:
- Rails 5/6使用Sprockets管理静态资源的场景,检查
app/assets/javascripts/application.js中是否存在//= require rails-ujs语句,没有的话补上。 - Rails 6使用Webpacker的场景,检查
app/javascript/packs/application.js中是否存在import Rails from "@rails/ujs"; Rails.start()语句,没有的话补上。 - Rails 7+使用Turbo的场景不需要额外配置,只要Turbo脚本正常加载,会自动识别
method: :delete参数并发起DELETE请求。
- Rails 5/6使用Sprockets管理静态资源的场景,检查
- 检查
config/routes.rb中的Devise路由配置,保持默认配置即可,不要手动修改登出路由的请求方法:devise_for :users - 所有修改完成后,清理浏览器静态资源缓存,重启Rails开发服务再测试即可。
快速排查技巧:打开浏览器开发者工具的Console面板,点击登出按钮时如果出现
Rails is not defined或Turbo is not defined报错,可以直接确认是JS脚本未成功加载导致的问题。
内容的提问来源于stack exchange,提问作者Azizbek Nusratilloyev
相关产品推荐
相关产品推荐

