Rails 6环境变量无法加载?原Rails 5配置方式失效排查
Rails 6中.env文件变量无法读取的原因及解决方法
这个问题我碰到过好多次啦,核心原因其实是Rails版本间的依赖变化:
在Rails 5时代,框架本身不自带加载.env文件的功能,但大部分开发者会手动安装dotenv-rails这个gem来实现.env变量的加载——你之前的Rails 5项目应该也是无意中(或者特意)添加了这个依赖,所以.env里的变量能被正常读取。
但到了Rails 6,官方推荐使用内置的credentials加密系统来管理敏感变量,不再默认包含dotenv-rails,所以直接创建.env文件的话,框架根本不知道要去加载它,自然就返回nil了。
解决方法(两种可选)
方法一:继续使用.env文件(兼容旧习惯)
打开项目根目录的
Gemfile,添加以下内容:gem 'dotenv-rails', groups: [:development, :test]这里指定只在开发和测试环境加载,生产环境不建议用.env文件(容易泄露敏感信息)。
执行安装命令:
bundle install重启你的Rails服务器(这很关键!不重启的话gem不会生效)
之后再访问ENV["MY_VARIABLE"]就能拿到你在.env里定义的值了。
方法二:使用Rails 6内置的Credentials系统(官方推荐)
如果想贴合Rails 6的最佳实践,建议用加密的credentials来管理变量:
执行编辑命令:
rails credentials:edit第一次执行会生成加密的
config/credentials.yml.enc文件和密钥config/master.key(这个密钥要绝对保密,别提交到版本控制!)在打开的编辑器里添加你的变量:
my_variable: 1234保存退出后,就能在应用里通过以下方式访问:
Rails.application.credentials.my_variable
额外注意事项
- 如果你用dotenv,要确保.env文件在项目根目录,格式是
KEY=VALUE,不要加多余空格(比如MY_VARIABLE = 1234这种写法会导致读取失败)。 - 生产环境一定要用服务器提供的环境变量(比如云平台的配置变量、服务器的系统环境变量),不要把.env文件部署到生产环境。
内容的提问来源于stack exchange,提问作者stevec
相关产品推荐
相关产品推荐

