Rails引擎运行ActiveAdmin/Devise生成器报configuration_hash未定义错误
问题分析
错误undefined method 'configuration_hash' for nil:NilClass的核心原因是:Devise 4.9.0的生成器在Rails 7环境下,尝试通过configs_for(env_name: Rails.env, name: "primary")获取数据库配置,但你的database.yml采用传统格式,未显式指定数据库连接的name: primary,导致configs_for返回nil。
另外,Rails引擎默认不会自动继承主应用的数据库配置上下文,即便你把database.yml复制到引擎目录,也需要确保配置格式符合Rails 7的解析要求。
解决方案
方案1:修改引擎的database.yml格式
给每个环境的配置添加name: primary,让configs_for能正确匹配到连接配置:
default: &default adapter: postgresql encoding: unicode pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> name: primary # 新增该行 development: <<: *default database: db_name_development test: <<: *default database: db_name_test production: <<: *default database: db_name_production username: db_name password: <%= ENV["DATABASE_PASSWORD"] %> staging: <<: *default database: db_name_staging username: db_name password: <%= ENV["DATABASE_PASSWORD"] %>
修改后重新运行生成器命令:
engine_name/bin/rails g active_admin:install
方案2:在主应用中执行生成器,迁移文件到引擎
由于引擎依赖主应用的数据库,更合理的做法是在主应用中完成ActiveAdmin初始化,再将相关文件迁移到引擎:
- 在主应用根目录运行:
rails g active_admin:install
- 将生成的
db/migrate/xxx_devise_create_admin_users.rb迁移文件复制到引擎的db/migrate目录 - 将
app/admin/目录复制到引擎的app/目录 - 将
config/initializers/active_admin.rb(及新增的devise.rb)复制到引擎的config/initializers目录 - 在引擎的
lib/engine_name/engine.rb中确保加载初始化文件:
module EngineName class Engine < ::Rails::Engine isolate_namespace EngineName initializer "engine_name.load_initializers" do config.paths["config/initializers"].each do |path| Dir[File.join(path, "*.rb")].sort.each { |f| require f } end end end end
方案3:手动创建必要文件绕过检测
如果只是想快速完成安装,可直接手动创建AdminUser模型和迁移文件,跳过生成器的数据库检测步骤:
- 在引擎的
app/models目录创建admin_user.rb:
class AdminUser < ApplicationRecord devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable end
- 在引擎的
db/migrate目录创建迁移文件,内容参考Devise生成的迁移模板,手动指定字段类型(比如inet对应PostgreSQL的IP字段)。
补充说明
Rails 7开始推荐带命名连接(primary、replica等)的新数据库配置格式,传统格式虽兼容,但部分gem的生成器会依赖新的配置结构。引擎作为独立模块,运行生成器时的上下文是孤立的,必须确保自身配置能被正确解析。
内容的提问来源于stack exchange,提问作者crodev
相关产品推荐
相关产品推荐

