2013-02-05 53 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對象中。