erb模板中的人偶数组循环

问题描述

我有以下Yaml:

+(abs(row(diag(n)) - col(diag(n))) == 1)

通过我的班级(用人偶代码)得到以下结果:

#      [,1] [,2] [,3] [,4] [,5]
#[1,]    0    1    0    0    0
#[2,]    1    0    1    0    0
#[3,]    0    1    0    1    0
#[4,]    0    0    1    0    1
#[5,]    0    0    0    1    0

我正在编写一个模板,以将数据拆分为多个文件(到目前为止有效)。我被卡在“ title07 ”项目上,如何从此处继续循环?

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'

解决方法

在数据和ERB中,关于数据的结构似乎都有些混乱。这个YAML ...

    title07:
      - title07_01: value07_01
      - title07_02: value07_02
      - title07_03: value07_03
      - title07_04: value07_03
      - title07_05: value07_04

...提供了一个由单键哈希组成的 array 作为主机哈希的'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