![](/img/trans.png)
[英]Array in array not correctly interpreted by foreach loop in Puppet erb
[英]Puppet array loop in erb template
我有以下 Yaml:
role::test::logos::filesanddata:
logo01.jpg:
title01: 'value01'
title02: 'value02'
title03: 'value03'
title04: 'value04'
title05: 'value05'
title06: 'value06'
title07:
- title07_01: value07_01
- title07_02: value07_02
- title07_03: value07_03
- title07_04: value07_03
- title07_05: value07_04
logo02.jpg:
title01: 'value01'
通過我的班級(在 Puppet 代碼中),我得到以下結果:
["logo01.jpg", {"title01"=>"value01", "title02"=>"value02", "title03"=>"value03", "title04"=>"value04", "title05"=>"value05", "title06"=>"value06", "title07"=>[{"title07_01"=>"value07_01"}, {"title07_02"=>"value07_02"}, {"title07_03"=>"value07_03"}, {"title07_04"=>"value07_04"}, {"title07_05"=>"value07_05}]}]
["logo02.jpg", {"title01"=>"value01"}]
我正在編寫一個模板來將數據拆分為多個文件(到目前為止有效)。 我被困在項目“ title07 ”上,我應該如何從那里繼續循環?
<%= @arraydata[0] %>
<% @arraydata.shift -%>
<% @arraydata.each do |item| -%>
<%= item['title01'] %>
<%= item['title02'] %>
<%= item['title03'] %>
<%= item['title04'] %>
<%= item['title05'] %>
<%= item['title06'] %>
<% item['title07'].each do |inner_item| -%>
<%= inner_item['title07']['title07_01'] %>
<% end -%>
<% end -%>
數據和 ERB 中似乎都存在關於數據結構的混淆。 這個 YAML ...
title07: - title07_01: value07_01 - title07_02: value07_02 - title07_03: value07_03 - title07_04: value07_03 - title07_05: value07_04
... 提供一個單鍵哈希數組作為主機哈希的“title07”鍵的值。 這不一定是錯誤的,但它非常可疑。 相對於使數據成為單個五元素散列,尚不清楚 thge 數組層應該為您做什么。
考慮根據該數據結構呈現的 ERB。 這里 ...
<% item['title07'].each do |inner_item| -%>
... item['title07']
是一個單鍵哈希數組,所以每個inner_item
都是這些哈希之一。 該散列中出現的一個鍵因散列而異,這使得這些不必要地難以使用。 但是,沒有一個鍵是'title07'
,所以這會中斷:
<%= inner_item['title07']['title07_01'] %>
你需要一些類似的東西
<%= inner_item['title07_01'] %>
,但考慮到鍵從inner_item
到inner_item
不同的事實。 如果您真的想嘗試使用它,那么您可能會發現使用each_with_index
而不是each
很有用,這樣您就可以從數組索引構造所需的哈希鍵。 或者,您可以只迭代內部哈希以獲取值。
但這證明了該數據結構的一些缺陷。 假設您將數據構造為單個多鍵哈希,繞過數組級別:
title07:
title07_01: value07_01
title07_02: value07_02
title07_03: value07_03
title07_04: value07_03
title07_05: value07_04
然后迭代條目可能會讓你更直接地得到你想要的東西:
<% item['title07'].each do |_, value| -%>
<%= value %>
<% end -%>
或者,由於鍵具有可計算的形式,您可以計算用於檢索葉數據的鍵:
<% 1...5.each do |i| -%>
<%= item['title07']["title07_0#{i}"] %>
<% end -%>
類似的也可以用於基於數組的結構,但所需的表達式會更復雜(並且留作練習)。
我不清楚最終目標是什么,但希望下面的示例可以幫助您解決遇到的問題
給定以下等級數據:
role::test::logos::filesanddata:
logo01.jpg:
title01: 'value01'
title02: 'value02'
title03: 'value03'
title04: 'value04'
title05: 'value05'
title06: 'value06'
title07:
- title07_01: value07_01
- title07_02: value07_02
- title07_03: value07_03
- title07_04: value07_03
- title07_05: value07_04
logo02.jpg:
title01: 'value01'
以下代碼假設filesanddata = lookup('role::test::logos::filesanddata')
<% @filesanddata.each_pair do |file, titles| -%>
<%- titles.each_pair do |title, values| -%>
<%- if values.is_a?(String) -%>
<%= value %>
<%- elsif value.is_a?(Array) -%>
<%# As mentioned by John Bollinger you have an array %>
<%# of hashes so we have to unpack that as well %>
<%- values.each do |value_hash| -%>
<%- value_hash.each_pair do |_, value| -%>
<%= value %>
<%- end -%>
<%- end -%>
<%- end -%>
<%- end -%>
<% end -%>
將創建一個包含以下內容的文件
value01
value02
value03
value04
value05
value06
value07_01
value07_02
value07_03
value07_03
value07_04
value01
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.