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

Rails+Devise登出报错:No route matches [GET] "/users/sign_out"

登出功能异常排查方案

1. 确认路由请求方法

先核对rails routes的输出,正常Devise登出路由应为:

DELETE /users/sign_out(.:format) users/sessions#destroy

如果路由是上述格式,说明问题出在请求方法不匹配——你用GET请求访问了需要DELETE的接口。

2. 修正导航栏登出链接代码

Rails 7默认启用Turbo,登出链接必须触发DELETE请求,正确写法如下:

  • 用button_to(推荐,自动处理请求方法):
<%= button_to "登出", destroy_user_session_path, method: :delete %>
  • 用link_to的话,需添加Turbo数据属性:
<%= link_to "登出", destroy_user_session_path, data: { turbo_method: :delete } %>

如果你的导航栏是普通a标签或未指定请求方法的link_to,会默认发GET请求,导致路由匹配失败。

3. 检查自定义SessionsController配置

如果自定义了SessionsController,确保:

  • routes.rb里正确关联控制器:
devise_for :users, controllers: { sessions: 'users/sessions' }
  • 自定义控制器继承自Devise的基类,且destroy方法未错误覆盖:
class Users::SessionsController < Devise::SessionsController
  # 保留Devise默认登出逻辑,或自定义时确保处理DELETE请求
  def destroy
    super
  end
end

4. 验证Turbo与CSRF配置

  • 布局文件(如application.html.erb)必须包含:
<%= csrf_meta_tags %>
<%= turbo_meta_tag %>
  • 全局禁用verify_authenticity_token会导致Devise无法处理非GET请求,检查ApplicationController是否有不当的skip_before_action :verify_authenticity_token配置。

5. 临时验证(仅用于排查,生产环境禁用)

若需快速确认问题根源,可在config/initializers/devise.rb中临时允许GET请求登出:

config.sign_out_via = :get

此方法存在安全风险,排查完成后务必恢复默认的:delete配置。

内容的提问来源于stack exchange,提问作者Samy Bellili

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 09:34:54