【问题标题】:How to force all nodes in yaml to be strings如何强制yaml中的所有节点都是字符串
【发布时间】:2011-08-29 12:56:10
【问题描述】:

我有一个巨大的配置 yaml 文件,其中所有节点都应作为字符串读取。一个例子:

model_names:
  Audi:
    A4:
      - A4
      - A 4
  Fiat:
    500:
      - 500  

我在 rails 中加载文件:

catalogue = File.read("#{Rails.root}/config/cars_catalogue.yml")
CARS_CATALOGUE = YAML.load(catalogue)

我的问题是,如果我要求:

CARS_CATALOGUE['model_names']['Fiat']['500']

它返回 nil,因为它认为 500: 是一个固定编号 - 但所有节点都应该始终是字符串 - 我不想在 yaml 文件中的任何地方都使用引号来强制执行此操作。那么我该如何以一种简单而聪明的方式做到这一点呢?

【问题讨论】:

    标签: ruby-on-rails ruby yaml


    【解决方案1】:

    你能重新生成文件吗?如果是,那么只需在数字中添加引号:

    model_names:
      Audi:
        A4:
          - A4
          - A 4
      Fiat:
        "500":
          - 500
    

    应该可以的。

    【讨论】:

    • 好像你没看问题,他特意说:i don't want to enforce this with quotes everywhere in the yaml file
    【解决方案2】:

    stringify_keys 应该将所有键转换为字符串

    catalogue = File.read("#{Rails.root}/config/cars_catalogue.yml")
    CARS_CATALOGUE = YAML.load(catalogue).stringify_keys
    

    最好还是用YAML.load(catalogue).symbolize_keys把所有的键都转成符号

    【讨论】:

    • 但它只适用于散列的直接键,不会递归到嵌套散列。
    • OP 已经用ruby-on-rails 标记了这个问题,所以这符合这里的要求,但是这个解决方案在纯红宝石环境中不起作用(stringify_keysActiveSupport 中)。只是想我会提到它。
    • 是的 - 你们三个都是对的 - 使用 stringify_keys 的东西,如前所述,它只适用于第一级键 - 不是嵌套的,也不是数组......所以有吗一种在所有节点上执行此操作的方法?
    • 写一个下降到哈希级别并执行操作的fxn?这应该不会太难,imo。
    【解决方案3】:

    Rails 目前具有递归键字符串化功能; check it

    【讨论】:

    • 仅在 Rails 4 中可用
    • @prusswan 这就是我使用当前这个词的原因。 Rails 目前是第 4 版。另外,请注意我指向该函数源的链接,该函数始终可以自行复制和使用。
    猜你喜欢
    • 1970-01-01
    • 2020-05-01
    • 2014-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多