【问题标题】:Rails 4 - Yaml configuration fileRails 4 - Yaml 配置文件
【发布时间】:2015-06-16 10:40:59
【问题描述】:

我有这个文件config/application.yml

settings:
  info:
    name: MyAppName
    domain: example.com
  contact:
    email: mail@example.com
    phone: 1234567890

environment.rb 我有这个

AppConfig = YAML::load_file('config/application.yml')

所以现在我可以使用 AppConfig["settings"]["info"]["name"] 访问它

如何使用AppConfig.settings.info.name 访问它?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4


    【解决方案1】:

    如果您使用的是 Rails 4.2 或更高版本,您可以使用 config_for 配置文件。它们需要放在 /config 文件夹下。 (其他没试过)

    在你的情况下是:config = Rails.application.config_for(:application)

    这是一种更清晰的 Rails 方式将配置加载到应用程序中。

    然后您可以使用 OpenStruct 为其启用点符号。

    APP_CONFIG = OpenStruct.new(config)

    【讨论】:

      【解决方案2】:

      这是一种无需任何宝石的简单方法,但如果您经常这样做,我不确定性能。

      思路是先将数据转换成JSON,然后将JSON解析成OpenStruct(Ruby内置):

      json_data = YAML::load_file('config/application.yml').to_json
      data = JSON.parse(json_data, object_class: OpenStruct)
      

      这会将所有哈希深度转换为 OpenStructs 并正确处理数组。

      例如,如果我有这个 YAML:

      people:
        -
          name: 'Jerry Rasmussen'
          address:
            address_1: '123 Street St'
        -
          name: 'Sara DeWetzel'
      

      然后就可以像这样加载和使用了:

      json_data = YAML::load_file('config/people.yml').to_json
      data = JSON.parse(json_data, object_class: OpenStruct)
      
      data.people.first.name
       => Jerry Rasmussen
      data.people.first.address.address_1
       => 123 Street St
      

      【讨论】:

        【解决方案3】:

        没有内置方法可以将 Hash 转换为可通过点语法访问的构造。您可以使用像 settingslogic gem 这样的 gem 并将其指向您的 application.yml 文件,或者查看源代码以了解完成此操作的过程。我认为最简单和最可靠的方法是使用流行的(阅读:在野外经过良好测试)和有据可查的 gem,而不是自己滚动。

        # app/models/settings.rb
        class Settings < Settingslogic
          source "#{Rails.root}/config/application.yml"
          namespace Rails.env
        end
        

        然后您可以通过

        访问各个设置
        Settings.info.name
        # MyAppName
        

        【讨论】:

        • 这是Gitlab的做法
        【解决方案4】:

        你可以安装hash dot gem

        然后,使用以下代码。

        require 'hash_dot'
        AppConfig = YAML::load_file('config/application.yml')
        

        现在调用

        AppConfig.settings.info.name
        

        它将返回您想要的输出。

        【讨论】:

          【解决方案5】:

          您可以使用recursive-open-struct gem

          app_config = YAML.load_file('config/application.yml').with_indifferent_access
          ros = RecursiveOpenStruct.new(app_config)
          
          puts ros.settings.info.name # MyAppName
          

          【讨论】:

            【解决方案6】:

            你可以看看rails native

            ActiveSupport::OrderedOptions < Hash

            虽然你仍然需要使用一些函数来转换你的哈希值,但作为一个起点,如果你真的不想要任何 gem。

            【讨论】:

              猜你喜欢
              • 2016-02-05
              • 2020-05-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-04-09
              • 2012-08-21
              • 1970-01-01
              • 2018-01-17
              相关资源
              最近更新 更多