2

我正在编写一个 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 -%>
4

1 回答 1

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
于 2013-02-15T02:04:56.383 回答