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_iteminner_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