如何将映射应用于Puppet / Ruby ERB模板中的值?

时间:2013-02-15 00:02:50

标签: ruby erb puppet

我正在编写一个ERB模板(对于Puppet模块),它会像这样传递一个Hash:

{"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 isn没有帮助我 - 尝试谷歌没有太大的成功。

我正在寻找能够在ERB函数中实现该代码的代码,或者为我的RTFM乐趣寻找相关文档的一些指示。

编辑: 对于未来的读者,这里的DigitalRoss答案翻译成我上面的ERB例子:

<% @my_data.each_pair do |k, v| -%>
<%= k %> <%= mappings[v["foo"]] || v["foo"] %>:<%= v["bar"] %>
<% end -%>

1 个答案:

答案 0 :(得分:2)

为了清晰起见,删除了erb内容,这就是你想要做的。 (p()函数只打印其参数。您可以在irb中尝试此操作。)

@my_data.each do |k, v|
  f, b = v['foo'], v['bar']
  p(mappings[f] || f)
  p(mappings[b] || b)
end