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