【问题标题】:dotenv gem doesn't get variables in Rails 6 or Ruby 2.6.5dotenv gem 在 Rails 6 或 Ruby 2.6.5 中没有变量
【发布时间】:2019-11-06 19:41:13
【问题描述】:

我使用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 文件中。
  • 另外,我尝试在我的 Gemfile 中添加 require: 'dotenv/rails-now',以防这是因为另一个 gem 问题。
  • 我将require 'dotenv/load' 添加到需要变量的文件中。
  • 我将'require dotenv/load' 添加到我的config/application.rb 文件中的各个位置

我单独进行的每个更改并使用byebug 在终端中检查变量是否已加载。并且每次变量仍然是nil

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

【问题讨论】:

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


    【解决方案1】:

    好的,我找到了让它工作的方法。不确定我下面的解释是否能解释为什么 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 shell,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'] 中一样,我会分别得到“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 应用程序的一项功能,因此它可能不是一种解决方法,而是编写应用程序的正确方法。

    编码愉快!

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢,我完全忘记了春天......我花了一些时间让它工作。
      • 这也是我的救命稻草!在 Rails 6.1.4 中。我跑了bin/spring stop,ENV 变量现在按预期加载。
      猜你喜欢
      • 2018-01-05
      • 2020-03-24
      • 2021-12-20
      • 1970-01-01
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      相关资源
      最近更新 更多