LoginSignup
1
1

erbで関数的にコードの再利用を行う

Last updated at Posted at 2023-07-19

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には特別な構文などさほど必要になるケースはないのかもしれない。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1