【问题标题】:How to apply a mapping to a value in a Puppet/Ruby ERB template?如何将映射应用于 Puppet/Ruby ERB 模板中的值?
【发布时间】:2013-02-15 00:02:50
【问题描述】:

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

【问题讨论】:

    标签: ruby erb puppet


    【解决方案1】:

    为了清楚起见,删除了 erb 的东西,这就是你想要做的。 (p() 函数只是打印它的参数。你可以在 irb 中试试这个。)

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

    【讨论】:

    • 完美,我将它移植到我的 ERB 模板中,它就像一个魅力。不知道 Ruby 我正在寻找一些函数/方法,而 (foo || bar) 构造就足够了......谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多