【问题标题】:traversing yaml for Rails app config为 Rails 应用程序配置遍历 yaml
【发布时间】:2011-04-25 13:00:35
【问题描述】:

我正在尝试加载应用配置 yaml - 我想要遍历的样式树:

风格: 名称:复古 风格: 名称:新派 风格: 名称:平原

我正在使用以下初始化程序加载它:

STYLES = YAML.load_file("#{RAILS_ROOT}/config/styles.yml")

我希望能够使用 STYLES[:style].each 或一些类似的函数来遍历每种样式。这是失败的,并且 STYLES 只返回列出的最后一个。我真的不想使用 xml(因为它很丑)......有没有办法让这个工作与 yaml 一起工作?

如果没有,我会很感激任何建议。

【问题讨论】:

    标签: ruby-on-rails app-config yaml


    【解决方案1】:

    样式树 yaml 没有按照您想要的方式工作;您需要重新构建它以支持具有不同名称的多种样式。

    Retro:
        type: style
    Nouvaeu:
        type: style
    Plain:
        type: style
    

    将每个块视为一个新对象。现在您可以使用以下方式访问它们:

    plain_style = YAML.load_file("#{RAILS_ROOT}/config/styles.yml")['Plain']
    plain_style['type']    >>> "style"
    

    【讨论】:

      【解决方案2】:

      这是一个比乔纳森的答案更深入的答案(否则是正确的)。

      Yaml 的格式更像 json 而不是 xml。 Yaml 和 json 旨在成为大多数语言中常见的基本但经常使用的数据结构的简单表示(并且在脚本语言中很普遍)。 Xml 被设计为一种标记语言和一种具有大量特性的元规范,以促进不同文档类型的混合。

      Yaml 中最基本、最常用的容器是序列和映射。在编程语言中,序列通常被称为列表或数组,而映射通常被称为字典、哈希、哈希图或数组(这很奇怪;我在看你的 PHP)。

      所以你的文档相当于yaml/json(两种类型都有效)文档:

      {"style": {"name": "Retro"}, "style": {"name": "Nouveau"}, "style": {"name": "Plain"}}
      

      我知道 json 或任何具有 {} 样式映射的语言,很容易看出问题所在。用 ruby​​ 写这个是:

      {"style" => ..., "style" => ..., "style" => ...}
      

      最后一个键/值对覆盖了前一个,它们以前是不可能得到的。因此,您需要更改文档格式。

      建议一

      Jonathan Julians 的建议相当不错:

      Retro:
          type: style
      Nouvaeu:
          type: style
      Plain:
          type: style
      

      建议二

      我可能会使用类似的东西:

      styles:
          Retro:
          Nouvaeu:
          Plain:
      

      或者,如果上下文暗示了“样式”,则干脆将其完全省略。

      建议三

      另一个更像 xml 的例子是使用 !!pair

      !!pair
      - style:
          name: Retro
      - style:
          name: Nouveau
      - style:
          name: Plain
      

      这或多或少(取决于解析器/语言)等价于数据结构:

      [("style", {"name": "Retro"}), 
       ("style", {"name": "Nouveau"}), 
       ("style", {"name": "Plain"})]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-04
        • 1970-01-01
        • 1970-01-01
        • 2016-10-10
        • 1970-01-01
        • 2012-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多