我正在尝试加载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一起工作?
如果没有,我将不胜感激。
答案 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" => ...}
最后一个键/值对会覆盖前一个键,它们以前是不可能的。因此,您需要更改文档格式。
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"})]