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'
通过我的 Class(在 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
... 提供 array of single-key hashes 作为主机 hash 的 'title07' key 的值。这不一定是错误的,但它非常可疑。相对于使数据成为单个 five-element 散列,目前还不清楚数组层应该为您做什么。
考虑根据该数据结构呈现的 ERB。这里...
<% item['title07'].each do |inner_item| -%>
... item['title07']
是 single-key 散列的数组,因此每个 inner_item
都是这些散列之一。该散列中出现的唯一键因散列而异,这使得这些散列变得不必要地难以使用。 None 的键是 'title07'
,但是,这会中断:
<%= inner_item['title07']['title07_01'] %>
你需要一些类似
的东西
<%= inner_item['title07_01'] %>
,但考虑到密钥不同于 inner_item
和 inner_item
的事实。如果您真的想尝试使用它,那么您可能会发现使用 each_with_index
而不是 each
很有用,这样您就可以从数组索引构造所需的散列键。或者,您可以只迭代内部哈希来获取值。
但这证明了该数据结构的一些缺陷。假设您将数据结构化为单个 multi-key 散列,绕过数组级别:
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 -%>
类似的方法也可以用于您的 array-based 结构,但所需的表达式会更复杂(留作练习)。
我不清楚最终目标是什么,但希望下面的示例可以帮助您解决遇到的问题
给定以下层次数据:
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
我有以下 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'
通过我的 Class(在 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
... 提供 array of single-key hashes 作为主机 hash 的 'title07' key 的值。这不一定是错误的,但它非常可疑。相对于使数据成为单个 five-element 散列,目前还不清楚数组层应该为您做什么。
考虑根据该数据结构呈现的 ERB。这里...
<% item['title07'].each do |inner_item| -%>
... item['title07']
是 single-key 散列的数组,因此每个 inner_item
都是这些散列之一。该散列中出现的唯一键因散列而异,这使得这些散列变得不必要地难以使用。 None 的键是 'title07'
,但是,这会中断:
<%= inner_item['title07']['title07_01'] %>
你需要一些类似
的东西<%= inner_item['title07_01'] %>
,但考虑到密钥不同于 inner_item
和 inner_item
的事实。如果您真的想尝试使用它,那么您可能会发现使用 each_with_index
而不是 each
很有用,这样您就可以从数组索引构造所需的散列键。或者,您可以只迭代内部哈希来获取值。
但这证明了该数据结构的一些缺陷。假设您将数据结构化为单个 multi-key 散列,绕过数组级别:
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 -%>
类似的方法也可以用于您的 array-based 结构,但所需的表达式会更复杂(留作练习)。
我不清楚最终目标是什么,但希望下面的示例可以帮助您解决遇到的问题
给定以下层次数据:
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