erbは他言語含め有名なテンプレートエンジンと比較すると特別な構文がとても少ない。
jinja系でいうところのmacro、pugとかでいうところのmixinの機能は最低限ほしいと感じることはないだろうか。
実は特別な構文など用意しなくてもerbではその辺の要件を簡単に満たせる
macro, mixin的なものが不要な理由
jinja系だとHTML snippetの関数的な再利用方法としてmacroがある
こんな感じだ
{% macro foo(title, content) %}
<details>
<summary>{{ title }}</summary>
<div>
{{ content }}
</div>
</details>
{% endmacro %}
{{ foo('最寄駅について', '大崎駅まで徒歩5分、大崎広小路駅まで徒歩6分です') }}
これをerbで書くとこんな感じで書ける
<% foo = lambda do |title, content| %>
<details>
<summary><%= title %></summary>
<div>
<%= content %>
</div>
</details>
<% end %>
<%- foo.call('最寄駅について', '大崎駅まで徒歩5分、大崎広小路駅まで徒歩6分です') %>
escape回りが二重にならないように気を付ける必要はあるがlambdaでできてしまう。
なんならblockを渡せばインラインなembed的なこともできる
<% foo = lambda do |title, &block| %>
<details>
<summary><%= title %></summary>
<div>
<%- block.call %>
</div>
</details>
<% end %>
<%- foo.call('最寄駅について') do %>
<ul>
<li>大崎駅まで徒歩5分</li>
<li>大崎広小路駅まで徒歩6分'</li>
</ul>
<% end %>
といった感じにも書ける。
rubyの柔軟さの上に立っているerbには特別な構文などさほど必要になるケースはないのかもしれない。