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

Rails API中无法销毁会话/实现登出功能的技术求助

问题分析与解决方案

看起来你在结合React和Rails Devise API做登出功能时踩了几个关键的坑,咱们一步步来梳理和修复:

1. 核心逻辑错误:你的destroy方法完全偏离了登出的需求

你现在的destroy方法里居然在执行@user.destroy——这是删除用户账号,而不是销毁用户会话(登出)!而且登出根本不需要用户再输入邮箱和密码,因为Devise已经通过当前会话识别了登录的用户,完全没必要重复校验。

2. 路由匹配问题(为什么日志没打印)

你测试的地址是http://localhost:3000/users/sign_out,但你的控制器是API::V1::SessionsController,如果路由配置没把Devise的会话路由指向这个API版本的控制器,请求根本不会走到你写的destroy方法里,而是走Devise默认的SessionsController的destroy逻辑,这就是为什么你看不到logout clicked日志,还返回了默认的204状态码。

先检查你的config/routes.rb,应该这样配置:

Rails.application.routes.draw do
  namespace :api do
    namespace :v1 do
      devise_for :users, controllers: {
        sessions: 'api/v1/sessions'
      }
    end
  end
end

对应的正确登出请求地址应该是http://localhost:3000/api/v1/users/sign_out,而不是根路径下的/users/sign_out。

3. 修复destroy方法的正确逻辑

登出的核心是销毁当前用户的会话,调用Devise的sign_out方法即可,修改后的代码如下:

def destroy
  puts "logout clicked"
  # 销毁当前登录用户的会话
  sign_out(current_user)
  # 清空session中的用户ID标记
  session[:user_id] = nil
  render json: { success: "Successfully logged out" }, status: :ok
end

另外,destroy方法完全不需要接收user_params,直接删掉相关的参数校验逻辑就行。

4. Postman测试的正确姿势

  • 请求方法:DELETE
  • 请求地址:http://localhost:3000/api/v1/users/sign_out
  • 不需要传任何用户参数(邮箱、密码都不用),但要确保你之前已经通过/api/v1/users/sign_in完成了登录,Postman会自动保存登录后的会话Cookie,只要是同一个窗口发送请求就会自动带上。

5. React端的配合调整

之前你用localStorage判断登录状态的方式可以优化:

  • 登录成功后,不需要手动设置localStorage,依赖Rails返回的会话Cookie即可(React的fetch/axios要配置withCredentials: true,这样请求时会自动带上Cookie)
  • 判断用户是否登录,可以新增一个current_user接口来校验,比如在SessionsController里加这个action:
def current_user
  if signed_in?
    render json: current_user, status: :ok
  else
    render json: { error: "Not logged in" }, status: :unauthorized
  end
end

然后在路由里添加:

namespace :api do
  namespace :v1 do
    devise_for :users, controllers: {
      sessions: 'api/v1/sessions'
    }
    get 'current_user', to: 'sessions#current_user'
  end
end
  • 登出时,发送DELETE请求到正确的API端点,请求成功后再清空localStorage(如果之前有存的话),并跳转到登录页。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 09:27:37