【问题标题】:Rails: Unable to use new `config/secrets.yml`Rails:无法使用新的`config/secrets.yml`
【发布时间】:2025-11-27 20:45:01
【问题描述】:

有人知道如何使用新的secrets.ymlproduction.rb 中设置 ENV 变量吗?

我收到了key: wrong number of arguments (0 for 1) 的以下信息:

生产.rb:

# DOES NOT WORK

ENV["SOME_STUFF_KEY"] = Rails.application.secrets.some_stuff.key
ENV["SOME_STUFF_SECRET_KEY"] = Rails.application.secrets.some_stuff.secret_key

# NOTE THAT THIS WORKS:

# ENV["SOME_STUFF_KEY"] = "abcdefg";
# ENV["SOME_STUFF_SECRET_KEY"] = "123456789123456789";

secrets.yml:

production:
  some_stuff:
    key: abcdefg
    secret_key: 123456789123456789

【问题讨论】:

  • 你试过没有嵌套值吗?生产后立即尝试 key 和 secret_key,看看会发生什么。
  • 另外,我认为您的设置违背了新机密文件的目的。在生产环境中,您应该从设置在索引文件之外的 ENV 变量中读取值(例如用于导出这些变量的 production.rb)。
  • rkon:没有嵌套值:production.rb:in []=':没有将 Fixnum 隐式转换为 String (TypeError)`
  • rkon:至于您的第二条评论,我不确定我是否理解。这些值是我的 Facebook 应用 ID 和密钥,所有敏感信息,那么 secrets.yml 不是最好的地方吗?我喜欢将所有敏感信息集中在一个地方的想法。
  • 对于错误,只需尝试在键上调用 to_s

标签: ruby-on-rails ruby-on-rails-4 yaml secret-key


【解决方案1】:

我没有找到任何关于嵌套的信息,就像您在 some_stuff 中所做的那样。 release notes 和所有其他博文仅以平面键为例:

development:
  secret_key_base: 3b7cd727ee24e8444053437c36cc66c3
  some_api_key: SOMEKEY

Rails.application.secrets.some_api_key 在开发环境中返回 SOMEKEY。

这就是为什么有人创建了dot_secrets gem(“在嵌套的 Rails.application.secrets 上启用点语法”)

【讨论】:

  • 非常感谢!但是,为了能够使用普通的 YML,不得不依赖 gem 似乎有点愚蠢?
  • 请记住:纯 YAML 为您提供哈希,而不是您可以调用方法的对象,就像 Rails.application.secrets 那样。这不是“正常的 YAML”。
  • FWIW,直到我发出 spring stop,我的新秘密才被重新加载。
【解决方案2】:

要获得像您这样的嵌套值,您需要使用此语法。

Rails.application.secrets.some_stuff[:secret_key]

【讨论】:

  • 或...Rails.application.secrets[:some_stuff][:secret_key]