Ruby on Rails 控制器中模拟Devise已认证用户且不存库的实现方案
解决方案
Devise 内置了控制器层的 sign_in 方法,可直接登录任意用户实例,不需要将用户写入数据库,也不需要用户走前端登录流程。
具体实现步骤如下:
- 构造未持久化的 User 实例,需赋值 Devise 要求的必填字段(如默认配置下的 email),避免校验报错
# 字段可根据你自定义的 User 模型调整,满足验证规则即可 fake_user = User.new(email: 'demo@example.com', password: 'fake_password')
- 直接调用
sign_in方法完成认证
# 加上 store: false 可避免 Devise 将用户信息写入 session,仅当前请求生效 sign_in fake_user, store: false
调用完成后,当前请求上下文内的 Devise 辅助方法(current_user、user_signed_in? 等)都会正常识别该模拟用户,完全满足页面展示场景的需求。
如果要完全贴合你期望的 fake_user.auth! 调用形式,可以给 User 模型新增实例方法封装逻辑,但因为 sign_in 属于控制器层方法,模型层默认无法直接调用,更推荐直接在控制器内调用 sign_in 即可。
内容的提问来源于stack exchange,提问作者Jason Ellis
相关产品推荐
相关产品推荐

