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

升级至Rails 7后遭遇ActionDispatch::Request::Session::DisabledSessionError

Rails 7 API-only模式下Devise登录测试报错DisabledSessionError的解决方案

问题根源

当应用设置config.api_only = true时,Rails会默认移除Cookie和Session相关中间件,而Devise的登录流程默认会尝试写入Session,直接触发DisabledSessionError。

解决方案

1. 为API-only应用添加Session存储支持

在config/application.rb中保留config.api_only = true的同时,添加以下配置:

# 启用Cookie和Session中间件
config.session_store :cookie_store, key: '_your_app_session'
config.middleware.use ActionDispatch::Cookies
config.middleware.use config.session_store, config.session_options

这段代码会把API-only模式下被移除的Cookie和Session中间件重新加载,让Devise可以正常处理Session操作,同时保持应用的API-only特性。

2. 优化Devise配置适配API场景

如果你的API主要使用Token认证(从测试代码看是获取authentication_token),可以让Devise跳过Session存储,避免不必要的Session操作。修改config/initializers/devise.rb:

config.skip_session_storage = [:http_auth, :token_auth]

这个配置告诉Devise,当使用HTTP认证或Token认证时,不要尝试写入Session,从根源上避免报错。

3. 测试用例临时调整(备用方案)

如果全局配置暂时无法生效,可以在测试类中手动启用Session:

setup do
  @request.env["rack.session"] = {}
end

不过更推荐前两种全局配置方式,这才是解决问题的根本方案。

为什么移除config.api_only = true能解决?

非API-only模式下,Rails默认加载Cookie和Session中间件,Devise可以正常写入Session,所以测试不会报错。但既然你不能移除该配置,上面的方案可以在保持API-only的前提下解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:15:27