如何无需指定节点名遍历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
相关产品推荐
相关产品推荐

