Rails 6升级至Rails 7时Rails Admin与Zeitwerk初始化报错问题
问题根源
Rails 7默认使用Zeitwerk作为常量加载器,它采用按需自动加载机制,和Rails 6的旧autoload机制逻辑不同。你手动在初始化文件里require Rails Admin的控制器文件,会打乱Zeitwerk的加载顺序,导致依赖的常量(比如RailsAdmin::ApplicationController或你的应用ApplicationController)未被正确加载。
具体解决步骤
移除手动require语句
删除初始化文件initializer/rails_admin.rb中的require 'rails_admin/main_controller'或require 'rails_admin/application_controller',Zeitwerk会自动在需要时加载这些常量,无需手动引入。自定义Rails Admin控制器的正确方式
如果需要修改RailsAdmin::MainController,不要在初始化文件里操作,而是在app/controllers/rails_admin/目录下创建对应的文件:# app/controllers/rails_admin/main_controller.rb module RailsAdmin class MainController < RailsAdmin::ApplicationController # 在这里添加你的自定义逻辑,比如before_action、自定义方法等 end endZeitwerk会自动识别并加载这个文件,确保依赖关系正确。
初始化阶段访问Rails Admin常量的处理
如果必须在初始化阶段访问Rails Admin的常量,用after_initialize钩子包裹代码,确保Rails和Zeitwerk完成所有加载工作后再执行:# initializer/rails_admin.rb Rails.application.config.after_initialize do # 这里可以安全调用RailsAdmin::MainController等常量 end确认Rails Admin版本兼容性
你使用的Rails Admin 3.0.0已经完全适配Rails 7和Zeitwerk,确保Gemfile中指定的版本正确,并且执行过bundle install更新依赖。
内容的提问来源于stack exchange,提问作者Prateek Vyas

