解析和编写YAML

时间:2013-02-05 18:45:19

标签: ruby yaml middleman

我有一个基本问题,我似乎无法理清。

我想在YAML文件中存储一小组Quote,然后使用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 %>

如果我只使用&lt;%= f%&gt;如果不管密钥而一个接一个地获取所有项目,但是找不到迭代它们并指定我想要的密钥或字段的方法。

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

2 个答案:

答案 0 :(得分: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"

是包含地图列表的单个Yaml文档。

答案 1 :(得分: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对象。