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

Rails+Next.js项目中Devise的current_user方法无法使用问题

Devise current_user返回null的解决方案(Rails API + Next.js Todo应用)

问题根因分析

你的ApplicationController继承自ActionController::API,但只引入了ActionController::Cookies和自定义的WithRescueConcern,没有引入Devise核心的认证辅助模块,导致current_user方法无法识别会话中的登录用户,最终返回null。而直接用User.find(1)能正常返回数据,是因为这是绕开会话认证的直接数据库查询,和Devise的会话管理无关。

具体修复步骤

  1. 在ApplicationController中引入Devise认证辅助模块
    修改app/controllers/application_controller.rb,添加Devise::Controllers::Helpers:
# frozen_string_literal: true

class ApplicationController < ActionController::API
  include ActionController::Cookies
  include WithRescueConcern
  include Devise::Controllers::Helpers # 新增:引入Devise认证辅助方法
end
  1. 配置Devise适配API场景
    打开config/initializers/devise.rb,调整以下配置项,确保会话管理适配API请求:
# 启用HTTP认证支持
config.http_authenticatable = true
# 关闭HTML格式的导航响应(API不需要)
config.navigational_formats = []
# 指定退出请求方式为DELETE
config.sign_out_via = :delete
  1. 保护CurrentUser接口(可选但推荐)
    在CurrentUserController中添加前置过滤器,确保只有已登录用户能访问该接口:
module Api
  module V1
    module Devise
      class CurrentUserController < ApplicationController
        before_action :authenticate_user! # 新增:强制用户登录后才能访问
        
        # ... 原有代码
      end
    end
  end
end
  1. 前端请求需携带凭证
    在Next.js的请求中,务必添加credentials: 'include',确保登录后的会话Cookie被正确传递到Rails后端:
// 示例:获取当前用户的请求代码
async function getCurrentUser() {
  const res = await fetch('/api/v1/current_user', {
    method: 'GET',
    credentials: 'include' // 必须添加,否则Cookie不会被携带
  });
  return res.json();
}

验证修复效果

重新启动Rails服务器,登录后调用/api/v1/current_user接口,此时current_user应该能正确返回登录用户的信息,序列化后的JSON不再是{"data":null}。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:50:57