0

jinja2 では、基本的にテンプレート関数のように、頻繁に使用されるテンプレート コードをマクロで指定できます。

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

そして、次のように使用します。

{% input("hello") %}

erb テンプレートで同様のことを達成する方法はありますか?

前もって感謝します!

4

1 に答える 1

1

メソッドの代わりにラムダ/プロシージャを使用すると、次のことができます。

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します。クロージャーを使用すると、ローカル変数を含む環境がキャプチャされるため、それに書き込むことができます。

于 2012-06-13T03:50:50.773 に答える