廚師是偉大的供應基本模板,但我期待將更多先進的模板邏輯。是這樣的可能:定義廚師ERB模板方法
<%
def say_hi()
-%>
<%= "hi" %>
<%
end
-%>
# Extraneous template data here
<% say_hi() -%> # Call to template method
在這個例子中,我希望,每當say_hi()
叫hi
會產生,但它不工作。
這種行爲是可能的,如果沒有,有沒有產生類似的行爲方式?我假設廚師模板遵循通用的ERB模板規則。
謝謝!
更新:背景故事一點點
我想模板化一個有它自己的格式化方案非常複雜config.yml
。它看起來是這樣的:
key: value
some other key:
- some other value
- another value
hash-like key:
hash-like value:
- element A
- element B
有這麼多的這些,我想的不是映射在網上直接屬性,我會定義所有的下一個公共密鑰和循環通過他們:
<% node['section']['help'].each do |key, value| -%>
<%= "#{key}: #{value}" %>
<% end -%>
而且這個作品很棒!它使我不必兩次定義(在屬性文件中的模板一次,一次)的一切,但是我覺得這個結構失控,特別是對於嵌套的散列中的數組:
<% node['section']['help'].each do |key, value| -%>
<% if value.kind_of?(Hash) -%>
<%= "#{key}: "%>
<% value.each do |subkey, subvalue| -%>
<%= " #{subkey}: #{subvalue}" %>
<% end -%>
<% else -%>
<%= "#{key}: #{value}" %>
<% end -%>
<% end -%>
,所以我想創建一個遞歸方法來識別三種類型(正常值,數組值和散列值)並處理每種類型的格式。我原型完整的方法看起來是這樣的:
<%
def determine_type(key, value, iteration)
if value.kind_of?(Hash)
-%>
<%= %Q(#{" " * (iteration * 2)} #{key}:) %>
<% value.keys do |subkey, subvalue| -%>
<% determine_type(subkey, subvalue, iteration + 1) -%>
<% end -%>
<%
elsif value.kind_of?(Array)
-%>
<%= %Q(#{" " * (iteration * 2)} #{key}:) %>
<% value.each do |subvalue| -%>
<%= %Q(#{" " * ((iteration + 1) * 2)} - #{subvalue}) %>
<% end -%>
<%
else
-%>
<%= %Q(#{" " * (iteration * 2)} #{key}: #{value}) %>
<%
end
end
-%>
而且它在這裏被稱爲:
<% node['section']['help'].each do |key, value| -%>
<% determine_type(key, value, 1) -%>
<% end -%>
可悲的是,如果只能直接返回值,而不是輸出到ERB模板,這個比較優雅的戰略突破。
你試過了嗎?輸出是什麼?什麼是用例? (我真的不知道這可能會用在哪裏)。由於對嘗試目標的描述太少,因此不可能知道變量或部分模板是否可用。 – Tensibai
我發現當他們開始擁有這麼多的邏輯時,很難長期維護模板。當模板簡單並且邏輯位於由配方調用的配方或庫中時,閱讀起來更容易。 – Martin
該函數應該返回字符串,並且應該像'<%= say_hi %>'那樣用'='輸出函數的結果。但是在模板中使用邏輯和函數是一個壞主意。只需創建另一個模板並在配方中使用哪個模板即可使用。 –