Ruby on rails YAML配置文件:为什么';示例';而不是:举例?
我为特定于环境的变量(如用户名和密码)设置了一个环境YAML文件。要在我的应用程序中使用这些变量,我需要使用Ruby on rails YAML配置文件:为什么';示例';而不是:举例?,ruby-on-rails,yaml,Ruby On Rails,Yaml,我为特定于环境的变量(如用户名和密码)设置了一个环境YAML文件。要在我的应用程序中使用这些变量,我需要使用app\u-CONFIG['username']而不是app\u-CONFIG[:username]。为什么会这样?我将如何启用后者?这不是一个大问题,但我不知道差异的原因,这让我很烦恼 config/initializers/load_app_config.rb APP_CONFIG = YAML.load_file("#{Rails.root}/config/app_config.ym
app\u-CONFIG['username']
而不是app\u-CONFIG[:username]
。为什么会这样?我将如何启用后者?这不是一个大问题,但我不知道差异的原因,这让我很烦恼
config/initializers/load_app_config.rb
APP_CONFIG = YAML.load_file("#{Rails.root}/config/app_config.yml")[Rails.env]
config/app_config.yml
development:
username: development_name
password: secret
production:
username: production_name
password: super_secret
在YAML返回的哈希上使用
符号化\u键
。加载\u文件默认情况下,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行为。其他语言可能不喜欢领先的:
如果您特别希望访问密钥作为符号,您可以使用symbol\u密钥代码>
APP_CONFIG = YAML.load_file("#{Rails.root}/config/app_config.yml")[Rails.env].simbolize_keys!
但大多数时候,这种努力是不值得的。在内部,90%的库在比较期间将符号转换为字符串,特别是在处理具有不同访问权限的散列时。因此,在故事的结尾,您可能希望在本例中保留字符串
最后一个选项是创建一个
这将允许您访问
APP_CONFIG[:development][:username]
APP_CONFIG['development'][:username]
APP_CONFIG['development']['username']
漠不关心地。它的工作原理是在内部将散列键存储为string,并将请求转换为[]
为string,这样它就可以一直工作。这是几个Rails组件使用的类,包括控制器中著名的params[]
hash。Perfect,谢谢@rmk。有什么重要的理由选择一种方式而不是另一种方式吗?或者仅仅是个人喜好(比如“键看起来更酷”)好吧,符号比字符串更容易访问,但我不认为这有什么大区别。只是使用符号比使用钥匙更鲁比。谢谢@rmk。我也是这么想的。Simone有一个有趣的观点:“在内部,90%的库在比较期间将符号转换为字符串,特别是当您处理具有不同访问权限的哈希时。因此,在故事的结尾,您可能希望在这种情况下保留字符串。”非常感谢@Simone提供了非常详细的答案。了解答案背后的基本原理非常有帮助!
APP_CONFIG[:development][:username]
APP_CONFIG['development'][:username]
APP_CONFIG['development']['username']