Rails ActiveAdmin带表单的batch_action导致assets:precompile报错
检查CI环境的数据库初始化顺序
ActiveAdmin带form参数的batch_action,可能在资源预编译阶段就触发了数据库查询(比如渲染form时要读取模型数据、枚举值)。本地数据库是提前就绪的所以没问题,但CI通常是先预编译资源,再创建数据库、执行迁移。试试调整CI脚本顺序,先完成数据库创建与迁移,再执行资源预编译;或者查看预编译阶段的日志,确认是否有ActiveRecord的查询请求在运行。排查batch_action的form代码是否隐式依赖数据库
如果form里用到了需要从数据库读取的数据(比如collection_select关联模型数据、动态枚举值),预编译时Rails可能会执行这些查询,但此时CI的数据库还没准备好。可以把form里的动态数据改成静态值测试,看CI是否还会报错;或者检查form块里有没有直接调用模型的all、pluck这类方法。验证CI环境的数据库配置与权限
虽然移除form后CI正常,但带form时可能触发了不同的代码路径,导致使用了错误的数据库配置(比如误读了开发环境配置,或者root用户在CI环境没有权限)。可以在CI环境打印Rails.configuration.database_configuration,对比有无form时的配置差异;确认CI环境的数据库是否允许root远程连接(如果用的是远程库),或者密码是否设置正确。检查ActiveAdmin版本兼容性
某些ActiveAdmin版本处理带form的batch_action时,可能存在预编译阶段触发数据库连接的bug,和当前Rails版本不兼容。试试升级或降级ActiveAdmin到相邻的稳定版本,看CI能不能恢复正常;也可以查一下ActiveAdmin的GitHub issues,有没有类似的预编译阶段数据库连接问题报告。排查CI的资源预编译配置
Rails的assets:precompile任务在不同环境下行为不同,CI可能开启了config.assets.compile = false或者其他优化选项,导致预编译时执行了更多代码逻辑,包括ActiveAdmin的batch_action form渲染。可以在CI用的环境配置文件(比如config/environments/production.rb)里临时设置config.assets.compile = true测试;也看看预编译命令是不是加了RAILS_ENV=production这类环境变量,确认环境配置正确。
内容的提问来源于stack exchange,提问作者Harry Wood

