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

ume*_*ezo 3 yaml ruby-on-rails

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

配置/初始化/ load_app_config.rb

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

配置/ app_config.yml

development:
  username: development_name
  password: secret

production:
  username: production_name
  password: super_secret
Run Code Online (Sandbox Code Playgroud)

Sim*_*tti 9

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

development:
  username: development_name
  password: secret
Run Code Online (Sandbox Code Playgroud)

可以通过

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

我想要一个特定的键作为符号,你应该在它前面添加:在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
Run Code Online (Sandbox Code Playgroud)

通常,这不是因为这是特定的Ruby行为.其他语言可能不会对领导感到高兴:.

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

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

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

最后一个选项是创建HashWithIndifferentAccess

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

这将允许您访问

APP_CONFIG[:development][:username]
APP_CONFIG['development'][:username]
APP_CONFIG['development']['username']
Run Code Online (Sandbox Code Playgroud)

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