如何配置devise token auth在登录响应中返回用户has_many关联的地址数据
Devise Token Auth 登录响应返回关联地址数据实现方案
直接选择重写 Sessions 控制器的方案即可,该方案仅修改响应结构,完全复用 Devise Token Auth 原有登录校验、令牌生成等核心逻辑,不会破坏默认配置。
操作步骤
1. 生成自定义 Sessions 控制器
执行 rails 生成命令:rails generate devise_token_auth:controllers users -c sessions
命令执行后会在 app/controllers/users/ 目录下生成 sessions_controller.rb 文件,控制器默认继承 DeviseTokenAuth::SessionsController,无需修改继承关系。
2. 覆写登录成功响应方法
仅需要覆写父类的 render_create_success 方法,追加地址关联数据即可,其他原有逻辑完全保留:
class Users::SessionsController < DeviseTokenAuth::SessionsController protected def render_create_success # 保留原有返回字段的基础上,追加用户关联的地址数据 render json: { data: resource_data( resource_json: @resource.token_validation_response.merge( addresses: @resource.addresses.as_json(only: [:id, :province, :city, :detail, :receiver, :phone]) ) ) } end end
- 代码中
@resource就是当前登录的用户实例,可直接通过关联方法addresses获取该用户的所有地址数据 as_json后的only参数可按需调整,用来过滤不需要返回的地址字段,也可以直接删除该参数返回所有地址字段
3. 修改路由指向自定义控制器
在 config/routes.rb 中修改 Devise Token Auth 的路由配置,指定使用自定义的 Sessions 控制器:
Rails.application.routes.draw do mount_devise_token_auth_for 'User', at: 'auth', controllers: { sessions: 'users/sessions' } # 其余原有路由保持不变 end
方案优势
- 完全不修改 Devise Token Auth 原有核心逻辑,不会破坏默认的登录校验、令牌刷新、过期处理等配置
- 无需额外发起请求,一次登录请求即可返回用户基础信息、鉴权令牌和所有地址数据,减少接口请求次数
内容的提问来源于stack exchange,提问作者Roger Peixoto
相关产品推荐
相关产品推荐

