我正在编写一个 ERB 模板(用于 Puppet 模块),它通过这样的哈希传递:
{"stuff" => {"foo"=>"aaa", "bar"=>"ccc"},
"other" => {"foo"=>"bbb", "bar"=>"ddd"}}
我在生成文本行的模板中对其进行迭代:
<% @my_data.each_pair do |k, v| -%>
<%= k %> <%= v["foo"] %>:<%= v["bar"] %>
<% end -%>
现在我想将一些映射应用到“foo”数据,并带有第二个哈希值,我将传递给模板。在伪代码中:
mappings = {"aaa" => "something", "bbb" => "somethingelse"}
<% @my_data.each_pair do |k, v| -%>
<%= k %> <%= TRANSLATE_SOMEHOW(v["foo"], mappings) %>:<%= v["bar"] %>
<% end -%>
...为了在值为“aaa”时获得“某物”,依此类推。如果“映射”中没有相应的键,我希望得到原始值。
用 Puppet 的语言做那种事情可能是可能的(通过用一些 Ruby 代码扩展它)我认为它可能更适合在 ERB 模板中,但我不知道该怎么做,不知道 Ruby 没有帮助我 - 尝试谷歌但没有多大成功。
我正在寻找代码以在 ERB 函数中实现这一点,或者为我的 RTFM 乐趣寻找一些指向相关文档的指针。
编辑:对于未来的读者,这里是 DigitalRoss 的答案,翻译成我上面的 ERB 示例:
<% @my_data.each_pair do |k, v| -%>
<%= k %> <%= mappings[v["foo"]] || v["foo"] %>:<%= v["bar"] %>
<% end -%>