【问题标题】:YAML configuration file: Why 'example' instead of :example?YAML 配置文件:为什么使用 'example' 而不是 :example?
【发布时间】:2012-10-02 22:51:56
【问题描述】:

我为环境特定变量(例如用户名和密码)设置了一个环境 YAML 文件。要在我的应用程序中使用这些变量,我需要使用 APP_CONFIG['username'] 而不是 APP_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

【问题讨论】:

    标签: ruby-on-rails yaml


    【解决方案1】:

    默认情况下,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 行为。其他语言可能对领先不满意:.

    如果您特别想将密钥作为符号访问,您可以使用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[] 哈希。

    【讨论】:

    • 非常感谢@Simone,非常详细的回答。了解答案背后的基本原理非常有帮助!
    【解决方案2】:

    在 YAML.load_file 返回的哈希上使用symbolize_keys

    【讨论】:

    • 完美,谢谢@rmk。有什么重要的理由选择一种方式而不是另一种方式吗?还是只是个人喜好(即“按键看起来更酷”)
    • 嗯,符号的访问速度比字符串快,但我不相信它有很大的不同。只是使用符号而不是键更红。
    • 谢谢@rmk。我也是这么想的。不过,Simone 有一个有趣的观点:“在内部,90% 的库在比较期间将符号转换为字符串,尤其是当您处理访问无关紧要的哈希时。因此,在故事的最后,您可能希望将字符串保留在案例。”
    猜你喜欢
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 2013-06-21
    • 2013-05-19
    • 1970-01-01
    • 2020-06-22
    • 2018-10-04
    • 1970-01-01
    相关资源
    最近更新 更多