Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails YAML配置文件:为什么';示例';而不是:举例?_Ruby On Rails_Yaml - Fatal编程技术网

Ruby on rails 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

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