我当时使用Link to code将环境变量存储在秘密文件中以进行开发。升级我的计算机上的红宝石和导轨后,宝石不再提取变量。为了找到原因,在尝试了不同的选择之后,我最终创建了两个相同的应用程序,只是有两个不同。红宝石和铁轨版本。一个应用程序能够提取环境变量,另一个则返回nil。有什么建议么?
我的设置
正在运行的应用程序具有
ruby "2.5.0"
gem 'rails', '~> 5.1.6'
无法正常运行的应用具有
ruby "2.6.5"
gem 'rails', '~> 6.0.0'
到目前为止我尝试过的事情
Dotenv::Railtie.load
添加到我的config/application.rb
文件中。require: 'dotenv/rails-now'
,以防由于另一个gem问题而导致。 require 'dotenv/load'
。 'require dotenv/load'
文件的各个位置添加了config/application.rb
我分别进行了每次更改,并使用dotenv gem来在终端中检入变量是否已加载。并且每次变量仍为nil
。
我想念什么吗?有什么建议么?还是我应该切换到另一个宝石?我听说byebug可能会做同样的事情,只是之前从未使用过。预先感谢您的帮助。
答案 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应用程序的功能,因此它可能不是解决方法,而是编码应用程序的正确方法。
快乐编码!