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

如何让Middleman的config.rb中嵌套循环正常运行?

解决Middleman嵌套循环内层不执行的问题

我之前在使用Middleman处理contentful导入的数据时,也碰到过几乎一模一样的问题!核心原因应该是Middleman::Util::EnhancedHash这个自定义哈希实现的迭代机制限制——它的each方法不支持嵌套重入调用,当外层循环还在遍历这个对象时,内层再调用同一个对象的each会直接跳过。

快速修复方案

把EnhancedHash转换成普通的Ruby哈希或数组,再进行嵌套循环:

方案1:转成普通哈希遍历

# 先将EnhancedHash转为原生哈希
datatype_hash = data.site.datatype.to_h

datatype_hash.each do |id, c|
  puts c
  # 内层遍历转换后的原生哈希,就能正常执行了
  datatype_hash.each do |id2, c2|
    puts c2
  end
end

方案2:提取所有值到数组遍历

如果不需要键(id),也可以直接提取值到数组:

# 提取所有数据项到数组
datatype_items = data.site.datatype.values.to_a

datatype_items.each do |c|
  puts c
  datatype_items.each do |c2|
    puts c2
  end
end

为什么会出现这个问题?

Middleman的EnhancedHash是对原生哈希的封装,主要是为了在模板里更方便地调用数据(比如用点语法c.name代替哈希键调用c[:name])。但它的迭代器实现没有考虑嵌套调用的场景——当外层each启动后,迭代器的状态被占用,内层调用同一个对象的each时会直接终止,导致内层循环完全不执行。

而转换成原生哈希/数组后,使用的是Ruby原生的迭代方法,完全支持嵌套遍历,问题就解决了。

验证步骤

  1. 先确认数据类型:在循环前加一行puts data.site.datatype.class,输出应该是Middleman::Util::EnhancedHash
  2. 运行修改后的代码,观察内层循环的puts c2是否正常输出所有数据项

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:27:30