Ruby升级至3.1.3、Rails升级至6.0.6后出现ActiveRecord常量未初始化错误
错误核心信息
运行bundle exec rspec spec时触发NameError: uninitialized constant ActiveRecord::Railtie::ActiveRecord,根源是加载ActiveRecord::Railties::ControllerRuntime时找不到ActiveRecord常量。
解决步骤
清理Bootsnap缓存
升级后缓存可能残留旧版本代码,执行命令清理:bundle exec rails tmp:clear或手动删除项目根目录下的
tmp/cache文件夹。更新RSpec依赖版本
Rails 6.0.x需搭配兼容的rspec-rails版本,在Gemfile中指定:gem 'rspec-rails', '~> 4.0'执行
bundle update rspec-rails完成更新。重新安装所有Gem依赖
删除Gemfile.lock文件,重新执行:bundle install确保所有gem版本与Rails 6.0.6、Ruby 3.1.3完全适配。
检查Zeitwerk加载配置
Rails 6默认使用Zeitwerk作为自动加载器,检查config/application.rb:- 确认未手动禁用Zeitwerk(无
config.autoloader = :classic设置) - 自定义的
autoload_paths/eager_load_paths不要与Zeitwerk规则冲突,避免手动加载已被Zeitwerk管理的文件。
- 确认未手动禁用Zeitwerk(无
修复Logger弃用警告
开头的弃用提示(Logger无需直接调用#after_initialize)虽非报错直接原因,但建议修复:
打开config/application.rb第53行,移除after_initialize中直接初始化Logger的代码,改为在config/initializers/目录下创建单独初始化文件配置Logger。验证测试环境配置
确认config/environments/test.rb未意外禁用ActiveRecord,确保配置包含ActiveRecord相关设置(例如config.active_record.dump_schema_after_migration = false,可根据项目需求调整)。
内容的提问来源于stack exchange,提问作者genonymous

