2013-02-15 63 views
2

我正在寫一個ERB模板(一個木偶模塊)被傳遞一個哈希這樣的:如何將映射應用於Puppet/Ruby ERB模板中的值?

{"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 -%> 

回答

2

爲清楚起見移除再培訓局的東西,這是你想要做什麼。 (該p()功能只是打印它的參數,你可以在IRB試試這個。)

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

完美的,我把它移植到我的ERB模板和它的工作就像一個魅力。不知道Ruby我在尋找一些函數/方法,而(foo || bar)構造就夠了......謝謝。 – Luke404 2013-02-15 08:23:43