簡體   English   中英

erb 模板中的 Puppet 數組循環

[英]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_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 -%>

類似的也可以用於基於數組的結構,但所需的表達式會更復雜(並且留作練習)。

我不清楚最終目標是什么,但希望下面的示例可以幫助您解決遇到的問題

給定以下等級數據:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM