dotenv gem在Rails 6或Ruby 2.6.5中没有获取变量

时间:2019-11-06 19:41:13

标签: environment-variables ruby-on-rails-6 ruby-dotenv

我当时使用Link to code将环境变量存储在秘密文件中以进行开发。升级我的计算机上的红宝石和导轨后,宝石不再提取变量。为了找到原因,在尝试了不同的选择之后,我最终创建了两个相同的应用程序,只是有两个不同。红宝石和铁轨版本。一个应用程序能够提取环境变量,另一个则返回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文件中。
  • 此外,我尝试在我的Gemfile中添加require: 'dotenv/rails-now',以防由于另一个gem问题而导致。
  • 我在需要变量的文件中添加了require 'dotenv/load'
  • 我在'require dotenv/load'文件的各个位置添加了config/application.rb

我分别进行了每次更改,并使用dotenv gem来在终端中检入变量是否已加载。并且每次变量仍为nil

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

2 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,即dotenv将环境变量添加到Gemfile并运行bundle后没有加载环境变量。需要重新启动Spring才能使更改生效。在spring stop anad重新启动Rails控制台/服务器后,识别出ENV变量。

答案 1 :(得分:0)

好的,我找到了一种使之工作的方法。不知道我下面的解释是否可以解释为什么gem dotenv无法在Rails 6中使用。但是,最新版本的Rails中现在有更好的方法。

参考

我想出了这个答案是因为Romil Mehta(Rails 6 adds support for multi environment credentials)的这篇博客文章

背景

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

现在会发生什么

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

有很多方法可以编辑加密文件,以获取自己的变量以供开发。博客作者使用以下Rails控制台行作为示例:EDITOR=vim rails credentials:edit。我更喜欢使用“ nano”作为编辑器,因此将控制台行更改为:EDITOR=nano rails credentials:edit

新方法

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

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

之前,在我的应用程序中,我将仅通过像ENV['variable_name']ENV['server_base_url']中那样调用ENV['oauth_token']来引用其中一个密钥,然后得到'{{3} }”或“ 123”。现在,要执行相同的操作,我需要编写代码:Rails.application.credentials.section_name[:variable_name],在上面的列表中,“ section_name”是“ oauth”,后跟三个变量名。因此,要引用“ oauth_token”,我会做:Rails.application.credentials.oauth[:oauth_token]

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

摘要

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

快乐编码!