You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在ERB文件中遍历嵌套YAML数据遇阻,求解决方案

问题根源:YAML重复键会被覆盖

你遇到的核心问题是YAML不允许同一个键重复定义——在你的数据文件里,每个category下的sub被重复写了三次,这会导致YAML解析器只保留最后一个sub的值,前面的都会被覆盖,所以你的ERB循环自然没法遍历到所有子项。

第一步:修正YAML数据结构

把重复的sub改成数组形式,这样就能存储多个子项了。修正后的YAML应该是这样:

- category1:
    title: Title 1
    subs:  # 这里把sub改成复数形式的数组键,更清晰
      - name: name1
        desc: desc1
      - name: name2
        desc: desc2
      - name: name3
        desc: desc3
- category2:
    title: Title 2
    subs:
      - name: name1
        desc: desc1
      - name: name2
        desc: desc2
      - name: name3
        desc: desc3

注意:我把sub改成了subs(数组),每个子项用-开头,这样YAML会把它解析成一个包含多个哈希的数组,而不是重复覆盖的单个哈希。

第二步:调整ERB循环代码

现在数据结构正确了,对应的ERB循环需要遍历外层的分类,然后遍历每个分类下的subs数组:

<% data.filename.each do |category_item| %>
  <% # 因为外层是数组,每个元素是一个键值对(比如category1 => {...}) %>
  <% category_item.each do |category_name, category_data| %>
    <h2><%= category_data["title"] %></h2>
    <ul>
      <% category_data["subs"].each do |sub| %>
        <li>
          <strong><%= sub["name"] %></strong>: <%= sub["desc"] %>
        </li>
      <% end %>
    </ul>
  <% end %>
<% end %>

代码说明:

  1. 首先遍历data.filename的外层数组,每个元素是一个包含分类名和分类数据的哈希(比如{ "category1" => { title: "...", subs: [...] } })
  2. 然后遍历这个哈希的键值对,拿到分类的标题和子项数组
  3. 最后遍历subs数组,输出每个子项的name和desc

如果你的数据结构外层是直接的哈希而不是数组(比如去掉开头的-),那ERB代码可以简化一点,但根据你原来的写法,外层是数组,所以上面的代码更匹配你的场景。

内容的提问来源于stack exchange,提问作者Brad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:31:31