erb模板中的Puppet数组循环



我有以下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'

通过我的课程(木偶代码(,我得到了以下结果:

["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 -%>

我不清楚最终目标是什么,但希望下面的例子能帮助您解决问题

给定以下层次数据:

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

数据和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_iteminner_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 -%>

类似的方法也可以用于基于数组的结构,但所需的表达式会更复杂(这只是一个练习(。

最新更新