You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署Ruby应用至Heroku时出现‘NameError: uninitialized constant Dotenv’错误的技术求助

解决Heroku部署中Dotenv未初始化的常量错误

你遇到的问题核心是:Heroku部署时Ruby找不到Dotenv常量,这是因为dotenv gem仅被添加到development和test环境组,但代码里的Dotenv.load语句在production环境下仍会被Ruby解析,进而触发常量查找失败的错误。

问题根源

Ruby在解析代码时,会先检查所有常量引用——哪怕这些引用处于永远不会执行的条件块里。你的config/environment.rb中有这么一行:

Dotenv.load if ENV['SINATRA_ENV'] == "development"

在Heroku的production环境中,dotenv gem并未被安装(它只属于development/test组),所以Ruby找不到Dotenv这个常量,直接抛出NameError。

解决方案

可以通过两种方式修复这个问题:

方案1:添加常量存在性检查

修改config/environment.rb中的代码,确保只有当Dotenv常量存在时才调用它:

if ENV['SINATRA_ENV'] == "development" && defined?(Dotenv)
  Dotenv.load
end

defined?(Dotenv)会先验证常量是否存在,只有在development环境且gem已加载的情况下才执行Dotenv.load,彻底避免了production环境下的常量查找错误。

方案2:在development环境下显式require dotenv

另一种方法是在development环境下先引入dotenv,再执行加载操作,确保production环境下不会触发常量检查:

if ENV['SINATRA_ENV'] == "development"
  require 'dotenv'
  Dotenv.load
end

这种方式依赖你的Gemfile已经把dotenv归入development组,本地开发时会正常加载,而production环境下这部分代码不会执行,也就不会触发Dotenv常量的查找。

额外检查步骤

  1. 确认Heroku环境变量:运行heroku config:get SINATRA_ENV,确保返回值是production。如果误设为development,会导致Bundler尝试加载development组的gem,这不符合Heroku生产环境的要求。
  2. 重新部署:修改代码后,提交到Git并推送到Heroku:
git add .
git commit -m "Fix Dotenv constant error in production"
git push heroku main

这样应该就能解决你遇到的部署错误了。

内容的提问来源于stack exchange,提问作者fmp19

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 19:37:37