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

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后缀的路径报错,不是路径辅助方法本身写错了。
修复步骤
  1. 补全布局文件head区域的JavaScript引入标签,和已有的样式表标签放在同级位置:
    • 如果你使用Rails 6及更早版本、或者Rails7使用jsbundling方案,添加如下标签:
    = javascript_include_tag "application", "data-turbolinks-track": "reload", defer: true
    
    • 如果你使用Rails 7+默认的Importmap方案,添加如下标签:
    = javascript_importmap_tags
    
  2. 确认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请求。
  3. 检查config/routes.rb中的Devise路由配置,保持默认配置即可,不要手动修改登出路由的请求方法:
    devise_for :users
    
  4. 所有修改完成后,清理浏览器静态资源缓存,重启Rails开发服务再测试即可。

快速排查技巧:打开浏览器开发者工具的Console面板,点击登出按钮时如果出现Rails is not defined或Turbo is not defined报错,可以直接确认是JS脚本未成功加载导致的问题。

内容的提问来源于stack exchange,提问作者Azizbek Nusratilloyev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:12:33