YAML配置文件:为什么'example'而不是:example?

时间:2012-10-02 22:51:56

标签: ruby-on-rails yaml

我为环境特定变量(如用户名和密码)设置了一个环境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

2 个答案:

答案 0 :(得分:9)

默认情况下,YAML键呈现为String。

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[]哈希。

答案 1 :(得分:2)

对YAML.load_file

返回的哈希使用symbolize_keys