2013-02-05 54 views
2

我有一个基本问题,我似乎无法理清。解析和撰写YAML

我想在YAML文件中存储一小组报价,然后使用Ruby Middlemanapp在网站中迭代它。我不确定它是我的YAML文件组合还是我试图通过它或两者迭代的方式。

YAML(quotes.yml)

--- 
quote: "This is a quote" 
attribution: "Kate Something" 
extras: "Braintree" 
--- 
quote: "Blah blah" 
attribution: "Donna Doe" 
extras: "Essex" 
--- 
quote: "Blah blah" 
attribution: "Donna Doe" 
extras: "Essex" 

ERB

<% data.quotes.each do |f| %> 
    <%= f["quote"] %> #f.quote <%= f["attribution"] %> 
<% end %> 

如果我只是用<%= F%>如果获得所有项目陆续不管关键的,但找不到任何迭代它们并指定我想要的键或字段的方式。

http://middlemanapp.com/advanced/local-data/

回答

5

在YAML ,, ---在YAML流开始一个新的文件,所以在你的quotes.yaml你有三个独立的文件,你只读取第一个。

我想你想是这样的:

- quote: "This is a quote" 
    attribution: "Kate Something" 
    extras: "Braintree" 

- quote: "Blah blah" 
    attribution: "Donna Doe" 
    extras: "Essex" 

- quote: "Blah blah" 
    attribution: "Donna Doe" 
    extras: "Essex" 

这是S含地图列表单YAML文件。

+0

此解决方案似乎正常工作。一个单独的问题 - 如果'额外:'有孩子?如何编写ERB来迭代上述YAML的孩子?另一个问题已发布在这里:http://stackoverflow.com/questions/15885392/accessing-multi-layered-yaml-and-middleman –

2

问题是您的YAML文件格式。

---是文档的标记。 YAML.loadYAML.load_file不想读取多个文件,只有第一个,所以你需要采取不同的轨道。

尝试使用YAML.load_documents(File.read('quotes.yml'))代替:

 
irb(main):005:0> asdf = YAML.load_documents(File.read('quotes.yml')) 
[ 
    [0] { 
       "quote" => "This is a quote", 
     "attribution" => "Kate Something", 
      "extras" => "Braintree" 
    }, 
    [1] { 
       "quote" => "Blah blah", 
     "attribution" => "Donna Doe", 
      "extras" => "Essex" 
    }, 
    [2] { 
       "quote" => "Blah blah", 
     "attribution" => "Donna Doe", 
      "extras" => "Essex" 
    } 
] 

换句话说,您会收到散列的数组,您的特定数据文件。每个数组元素都是一个不同的文档,被解析回到它的Ruby对象中。