使用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自动生成对应模型的辅助方法类型定义:
- 添加gem到Gemfile:
gem 'sorbet-devise', group: :development - 安装并生成RBI:
bundle install bundle exec rake sorbet:devise:generate_rbi - 重新运行类型检查:
bundle exec srb tc
内容的提问来源于stack exchange,提问作者Vinicius Rocha
相关产品推荐
相关产品推荐

