2012-06-13 61 views
0

在Jinja2的我可以指定經常使用的模板代碼中的宏,基本上和模板函數:jinja2中宏的erb等價物是什麼?

{% macro input(name, value='', type='text', size=20) -%} 
    <input type="{{ type }}" name="{{ name }}" value="{{value|e }}" size="{{ size }}"> 
{%- endmacro %} 

,然後用它像這樣:

{% input("hello") %} 

有什麼辦法來完成與再培訓局類似的東西模板?

在此先感謝!

回答

1

如果使用的lambda /特效的代替方法然後可以:

require 'erb' 

doc = <<ERB 
<% input = lambda do |name, value='', type='text', size=20| %> 
    <input type="<%= type %>" name="<%= name %>" value="<%= value || 'e' %>" size="<%= size %>"> 
<% end %> 
<% input["hello"] %> 
<% input["HELLO", 123, 'select', 50] %> 
ERB 

puts ERB.new(doc, 0, '>').result 
# >> <input type="text" name="hello" value="" size="20"> 
# >> <input type="select" name="HELLO" value="123" size="50"> 

的問題是,ERB(和erubis)通過解析該文件並創建另一段代碼創建這些字符串中的值內部和外部的標籤是倒置的。然後標籤之間的模板被附加到某個局部變量上。 (實際上有解決這個問題的辦法,但是你必須深入一些,我必須在以前擴展erubis來獲得我想要的替代行爲)。當您創建方法時,會更改範圍並且不再可以看到本地變量,因此它會給您一些模糊的錯誤NameError: undefined local variable or method ‘_erbout’ for main:Object使用閉包時,會捕獲環境(包括局部變量),以便您可以寫入該環境。

相關問題