3

我为环境特定变量(如用户名和密码)设置了一个环境 YAML 文件。要在我的应用程序中使用这些变量,我需要使用APP_CONFIG['username']而不是APP_CONFIG[:username]. 为什么是这样?我将如何启用后者?不是主要问题,但不知道差异的原因让我很困扰。

配置/初始化程序/load_app_config.rb

APP_CONFIG = YAML.load_file("#{Rails.root}/config/app_config.yml")[Rails.env]

配置/app_config.yml

development:
  username: development_name
  password: secret

production:
  username: production_name
  password: super_secret
4

2 回答 2

9

默认情况下,YAML 键呈现为字符串。

development:
  username: development_name
  password: secret

可通过

APP_CONFIG = YAML.load_file("#{Rails.root}/config/app_config.yml")[Rails.env]
APP_CONFIG['development']['username']
# => "development_name"

如果你想让一个特定的键成为一个符号,你应该在 YAML 文件中使用 : 作为前缀。

development:
  :username: development_name
  :password: secret

APP_CONFIG = YAML.load_file("#{Rails.root}/config/app_config.yml")[Rails.env]
APP_CONFIG['development'][:username]
# => "development_name"
APP_CONFIG['development']['username']
# => nil

通常不会这样做,因为这是特定的 Ruby 行为。其他语言可能对领先的 :. 不满意。

如果您特别想将密钥作为符号访问,您可以使用symbolize_keys!

APP_CONFIG = YAML.load_file("#{Rails.root}/config/app_config.yml")[Rails.env].simbolize_keys!

但大多数时候,努力是不值得的。在内部,90% 的库在比较期间将符号转换为字符串,尤其是当您处理具有无关访问的哈希时。因此,在故事的最后,您可能希望在这种情况下保留字符串。

最后一个选项是创建一个HashWithIndifferentAccess

APP_CONFIG = HashWithIndifferentAccess.new(YAML.load_file("#{Rails.root}/config/app_config.yml")[Rails.env])

这将允许您访问

APP_CONFIG[:development][:username]
APP_CONFIG['development'][:username]
APP_CONFIG['development']['username']

冷漠。它通过在内部将哈希键存储为字符串并将请求转换[]为字符串来工作,因此它始终有效。这是几个 Rails 组件使用的类,包括params[]控制器中著名的哈希。

于 2012-10-03T00:13:30.930 回答
2

symbolize_keys在 YAML.load_file 返回的哈希上使用

于 2012-10-02T22:57:54.660 回答