升级至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
相关产品推荐
相关产品推荐

