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

使用Tapioca生成的Devise RBI文件为何不包含current_user方法?

解决Sorbet + Rails + Devise中current_user类型检查报错的问题

Devise的current_user等辅助方法是运行时动态注入到控制器的,Sorbet作为静态类型检查器无法自动识别这类动态生成的方法,Tapioca默认生成的gem RBI只会包含define_helpers的定义,不会为具体模型生成对应的current_user方法。以下是解决步骤:

1. 手动声明Devise辅助方法的类型定义

在sorbet/rbi/目录下创建一个自定义RBI文件(比如devise_helpers.rbi),手动声明控制器中需要的Devise辅助方法:

# typed: true
class ApplicationController < ActionController::Base
  # 根据你的实际用户模型调整返回值类型,比如用户未登录返回nil就用User?
  def current_user: () -> User?
  # 声明用户登录状态检查方法
  def user_signed_in?: () -> T::Boolean
  # 如果有其他Devise辅助方法(比如current_admin),按需添加
end

2. 确保ApplicationController正确引入Devise Helper

确认你的ApplicationController已经包含Devise的控制器Helper:

class ApplicationController < ActionController::Base
  include Devise::Controllers::Helpers
  # 若使用多模型Devise,可通过devise_group统一分组
  # 示例:devise_group :account, contains: [:user, :admin]
end

3. 同步RBI文件并重新检查类型

运行以下命令让Sorbet加载新的RBI文件:

bundle exec tapioca sync
bundle exec srb tc

补充:使用专用gem自动生成类型定义

如果不想手动维护RBI,可以使用sorbet-devise gem自动生成对应模型的辅助方法类型定义:

  1. 添加gem到Gemfile:
    gem 'sorbet-devise', group: :development
    
  2. 安装并生成RBI:
    bundle install
    bundle exec rake sorbet:devise:generate_rbi
    
  3. 重新运行类型检查:
    bundle exec srb tc
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:50:10