本地预编译Rails资产失败:ActiveRecord适配器未指定错误
解决本地预编译Rails生产环境资产时的数据库适配器错误
嘿,我来帮你搞定这个ActiveRecord::AdapterNotSpecified报错!这个问题我之前也碰到过,主要和生产环境的数据库依赖、预编译时的数据库连接逻辑有关,咱们一步步来排查解决。
为啥会出这个错?
从你的配置和报错信息来看,核心原因有两个:
- 本地没装生产环境的数据库gem:你的
Gemfile里把pg只放在了:production组,平时本地bundle install默认不会装这个组的gem。当你用RAILS_ENV=production跑预编译时,Rails找不到PostgreSQL的适配器,自然没法解析DATABASE_URL里的连接信息。 - 预编译时不小心触发了数据库连接:虽然你设了
config.assets.initialize_on_precompile = false,但你的代码里可能有初始化器或者模型引用在预编译过程中被加载了,导致Rails非要去连数据库,可这时候适配器还没装,直接报错。
具体解决办法
办法一:临时装生产环境gem再预编译
如果你只是偶尔需要预编译,可以临时把production组的gem装上:
# 安装所有组的gem(包括production) bundle install --without none # 导出Heroku的数据库URL export DATABASE_URL=$(heroku config:get DATABASE_URL) # 执行预编译 RAILS_ENV=production bundle exec rake assets:precompile
预编译完之后,要是想回到本地开发的依赖状态,跑个bundle install --without production就行。
办法二:跳过数据库检查直接预编译(推荐)
不想装pg gem?没问题,Rails提供了一个环境变量,可以让预编译彻底跳过数据库环境检查:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1 RAILS_ENV=production bundle exec rake assets:precompile
这个方法最省事,不用装额外gem,也不用导出数据库URL,直接就能生成生产环境的资产文件。
办法三:优化database.yml配置
你也可以给production环境显式加上适配器配置,这样Rails能明确识别数据库类型,减少报错概率:
production: <<: *default adapter: postgresql url: <%= ENV['DATABASE_URL'] %>
不过这个方法还是得配合办法二的环境变量用,毕竟本地没装pg gem的话,还是没法真的连接数据库。
小提示
- 预编译完的
public/assets目录记得提交到Git,这样Heroku部署时会自动跳过资产预编译,节省部署时间。 - 要是你经常需要本地预编译生产资产,可以把
DISABLE_DATABASE_ENVIRONMENT_CHECK=1加到你的shell配置文件(比如.bashrc或.zshrc)里,以后直接跑预编译命令就行。
内容的提问来源于stack exchange,提问作者naughie
相关产品推荐
相关产品推荐

