dotenv gem 在 Rails 6 或 Ruby 2.6.5 中无法获取变量

Chr*_*ton 5 environment-variables ruby-on-rails-6 ruby-dotenv

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

我的设置

工作应用程序有

ruby "2.5.0"
gem 'rails',        '~> 5.1.6'
Run Code Online (Sandbox Code Playgroud)

非工作应用程序有

ruby "2.6.5"
gem 'rails',        '~> 6.0.0'
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试过的

  • 我阅读了 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可能会做同样的事情,只是以前从未使用过。预先感谢您的帮助。

Chr*_*ton 5

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

参考

我想出了这个答案是因为 Romil Mehta 的这篇博文(Rails 6 增加了对多环境凭据的支持

背景

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

现在发生了什么

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

有很多方法可以编辑加密文件,以便为开发添加自己的变量。博客作者使用这个轨控制台线为例: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
Run Code Online (Sandbox Code Playgroud)

之前,在我的申请,我将引用密钥之一通过只调用ENV['variable_name']ENV['server_base_url']ENV['oauth_token']和我会得到的输出“ HTTP: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 应用程序的一项功能,因此它可能不是一种解决方法,而是编写应用程序的正确方法。

快乐编码!