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

如何无需指定节点名遍历Rails嵌套本地化YAML文件?

解决方案:动态遍历Rails本地化YAML的Benefits节点

当然有办法啦!你现在的写法需要硬编码循环的结束数字,确实不够灵活,下面给你几种实用方案,都能实现动态遍历,不用再指定固定的编号范围~

首先先回顾下你的现有文件:

现有本地化YAML文件

en:
  benefits:
    b01:
      heading: "Vestibulum viverra"
      text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
    b02:
      heading: "Nulla sed mollis massa"
      text: "Suspendisse potenti. Vestibulum viverra, lorem ac tincidunt tempor, elit eros ornare nisl."
    b03:
      heading: "Lorem ipsum dolor"
      text: "Nulla sed mollis massa, in efficitur est. Nunc ex risus, rutrum ut mi non, mollis pulvinar nisl."

现有视图代码

<% (1..3).each do |n| %>
  <% number = sprintf('%02d', n) %>
  <h2><%= raw t("benefits.b#{number}.heading") %></h2>
  <p><%= raw t("benefits.b#{number}.text") %></p>
<% end %>

方案1:直接遍历Benefits哈希(无需修改YAML)

你可以直接获取benefits对应的哈希对象,然后遍历它的键值对,这样不管YAML里新增或删除多少个bXX节点,视图都会自动同步:

<% t('benefits').each do |key, benefit| %>
  <h2><%= raw benefit[:heading] %></h2>
  <p><%= raw benefit[:text] %></p>
<% end %>

注意:Ruby 1.9及以上版本会保留哈希的插入顺序,所以遍历顺序会和你YAML里的节点顺序完全一致,不用担心乱序的问题。

如果你的项目使用的Ruby版本比较旧(低于1.9),或者担心哈希顺序可能变化,可以先对键排序再遍历:

<% t('benefits').keys.sort.each do |key| %>
  <% benefit = t('benefits')[key] %>
  <h2><%= raw benefit[:heading] %></h2>
  <p><%= raw benefit[:text] %></p>
<% end %>

这样会按照b01、b02、b03的顺序排列,保证显示顺序正确。


方案2:修改YAML为数组结构(更推荐)

其实从语义上来说,benefits是一个有序的列表,用数组来存储会比带编号的哈希键更合理,维护起来也更方便。修改后的YAML如下:

en:
  benefits:
    - heading: "Vestibulum viverra"
      text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
    - heading: "Nulla sed mollis massa"
      text: "Suspendisse potenti. Vestibulum viverra, lorem ac tincidunt tempor, elit eros ornare nisl."
    - heading: "Lorem ipsum dolor"
      text: "Nulla sed mollis massa, in efficitur est. Nunc ex risus, rutrum ut mi non, mollis pulvinar nisl."

对应的视图代码会更简洁:

<% t('benefits').each do |benefit| %>
  <h2><%= raw benefit[:heading] %></h2>
  <p><%= raw benefit[:text] %></p>
<% end %>

这种方式不仅代码更清爽,新增benefit时直接在YAML里加一条就行,完全不用考虑编号问题,是最推荐的方案~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:12:29