遍历yaml for Rails app config

时间:2011-04-25 13:00:36

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

我正在尝试加载app config yaml - 一个样式树,我想遍历:

style:
    name: Retro
style:
    name: Nouveau
style:
    name: Plain

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

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

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

如果没有,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

样式树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"

答案 1 :(得分:0)

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

Yaml的格式更像是json而不是xml。 Yaml和json旨在简单表示大多数语言中常见的基本但常用的数据结构(在脚本语言中很常见)。 Xml被设计为标记语言和元规范,具有大量功能,以便于混合不同的文档类型。

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

因此,您的文档等同于yaml / json(两种类型都有效)文档:

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

我知道json或任何带有{}式地图的语言,很容易看出问题所在。写在红宝石中的是:

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

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

建议1

Jonathan Julians的建议相当不错:

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

建议2

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

styles:
    Retro:
    Nouvaeu:
    Plain:

如果上下文隐含了“样式”,则完全不要这样做。

建议3

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

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

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

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