5

我正在使用dotenv gem将开发环境变量存储在机密文件中。在我的计算机上升级 ruby​​ 和 rails 后,gem 不再提取变量。为了尝试找出原因,经过一段时间的尝试不同的选择,我最终创建了两个相同的应用程序,只有两个不同。ruby 和 rails 版本。一个应用程序能够提取环境变量,另一个应用程序返回 nil。有什么建议么?

我的设置

工作申请有

ruby "2.5.0"
gem 'rails',        '~> 5.1.6'

非工作应用程序有

ruby "2.6.5"
gem 'rails',        '~> 6.0.0'

到目前为止我尝试过的

  • 我阅读了 gem 网站上的信息并尝试添加Dotenv::Railtie.load到我的config/application.rb文件中。
  • 此外,我尝试添加require: 'dotenv/rails-now'我的 Gemfile,以防它是因为另一个 gem 问题。
  • 我添加require 'dotenv/load'到需要变量的文件中。
  • 我添加'require dotenv/load'config/application.rb文件中的各个位置

我单独进行的每项更改并使用byebug来检查终端是否已加载变量。并且每次变量是静止的nil

有什么我想念的吗?有什么建议么?或者我应该切换到另一个宝石?我听说figaro可能会做同样的事情,只是以前从未使用过。预先感谢您的帮助。

4

2 回答 2

6

好的,我找到了让它工作的方法。不确定我下面的解释是否能解释为什么 gem dotenv 不适用于 Rails 6。但是,现在在最新版本的 Rails 中有更好的方法来做到这一点。

参考

由于 Romil Mehta 的这篇博客文章,我想出了这个答案(Rails 6 添加了对多环境凭据的支持

背景

似乎从 Rails 5.2 开始,我们已经能够存储凭证而不是秘密。我不知道这一点,并继续使用上述宝石。

现在发生了什么

因此,在创建新的 RoR 应用程序时,config\credentials.yml.enc会在 Rails 应用程序中创建一个文件,该文件使用文件中的主密钥进行加密config\master.key。(注意:您应该在第一次 git 提交或您可能使用的任何其他版本跟踪器之前隐藏此文件。)

有很多方法可以编辑加密文件以添加您自己的变量以进行开发。博客作者以这个 rails 控制台行为例:EDITOR=vim rails credentials:edit. 我更喜欢 'nano' 作为我的编辑器,所以我将控制台行更改为:EDITOR=nano rails credentials:edit.

新方式

从 nano shell,credentials.yml.enc文件被解密,我可以读取它。然后我添加了存储在我的秘密文件中的凭据,我试图在我的整个应用程序中访问它。像这样的东西:

oauth:   
   server_base_url: http://localhost:3000
   oauth_token: 123
   oauth_secret: 456

ENV['variable_name']之前,在我的应用程序中,我会通过调用in来引用其中一个密钥,ENV['server_base_url']然后ENV['oauth_token']我会分别得到“ http://localhost:3000 ”或“123”的输出。现在,为了做同样的事情,我需要有代码:Rails.application.credentials.section_name[:variable_name],在我上面的列表中,“section_name”是“oauth”,后跟三个变量名。因此,要引用“oauth_token”,我会这样做:Rails.application.credentials.oauth[:oauth_token]

一旦我更改了ENV对代码的所有调用Rails.application.credentials,我的应用程序就可以工作了。它提取了秘密变量(现在是“凭据”)并让我的示例应用程序连接到 oauth 服务器以授权登录。

概括

同样,我不确定这如何解释为什么 gem 'dotenv' 在我的新 Ruby 和 Rails 环境中不起作用。但是,如果其他人遇到同样的问题,这里有一个解决方法!由于它是 RoR 应用程序的一项功能,因此它可能不是一种解决方法,而是编写应用程序的正确方法。

快乐编码!

于 2019-11-07T03:23:05.550 回答
3

我有一个类似的问题,在将 dotenv 添加到 Gemfile 并运行bundle. 需要重新启动 Spring 才能使更改生效。在spring stop重新启动 Rails 控制台/服务器后,ENV 变量被识别。

于 2020-06-27T18:40:25.217 回答