Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyテンプレートエンジン徹底解説:ERB・HAML・Slimの違いと使い方

ERBは、Rubyを代表するテンプレートエンジンのひとつです。

テンプレートエンジンを使うと、HTMLの中にRubyのコードを混在させて記述できるため、データベースから取得したデータをもとにWebページを動的に生成できます。

ERBは、Railsでビューをレンダリングする際のデフォルトのエンジンです。

補足:Railsでは、Ruby標準ライブラリのERBクラスではなく、erubiという実装が使われています。

この記事の後半で解説しますが、ERBはRailsがなくても単体で利用できます。

その前に、まずはERBの基本構文、Rubyプロジェクトでの使い方、そしてHAMLなど他のテンプレートエンジンとの比較を見ていきましょう。

それでは始めましょう!

ERB(Embedded Ruby)チュートリアル

ERBテンプレートとは、拡張子が.html.erbまたは.erbであるファイルのことです。

ERBテンプレート内に書いた内容は、基本的にはすべてHTMLとして扱われます。

ただし…特別なタグを使った場合は別です!

例を見てみましょう

Hello <%= name %>!

この<%= %>タグは、テンプレートエンジンによって中のRubyコードが評価され、その結果に置き換えられます。

文字列補間(インターポーレーション)のようなイメージですね。

<%= %>にある「=」に注目してください。

これはERBに対してタグの中身をレンダリングせよと指示する記号です。

一方、ループやif文などの制御構造を書くときは「=」を付けません。そうすることで、出力する必要のないものまで表示されるのを防げます。

間違ったタグを使うと、エラーが発生することもあるので注意しましょう。

次の例を見てください

<% if @favorite_food == "chocolate" %>
  Are you a chocolate lover? Here are some of our best PREMIUM chocolate bars!
<% else %>
  Here are our top 10 snacks that people bought this month.
<% end %>

これはERBのif文です。通常のRubyのif文と同じですが、特殊なテンプレート構文で囲まれており、ページがユーザー向けにレンダリングされるときに評価され、その結果に置き換えられます。

続いて、ERBのループの例です

<% @books.each do |book| %>
  <%= book.title %>
  <%= book.author %>
  
<% end %>

本の配列が渡されると、各本のタイトルと著者が改行付きで順番に出力されます。

Railsを使っている場合、対応するコントローラアクションを呼び出すと、このテンプレートが自動的にレンダリングされます。

RailsなしでERBを使う方法

Railsの外でERBを使って、レポートや静的サイトを作りたい場合もあるでしょう。

そんなときは、次のように書けます

require 'erb'

Book     = Struct.new(:title, :author)
template = ERB.new(File.read('template.erb'))

template.result_with_hash(books: [Book.new("test"), Book.new("abc")])

このコードを動かすには、テンプレート側の@booksbooksに置き換える必要があります。

Railsは「変数バインディング」と呼ばれるメタプログラミングの手法を使っています。

これにより、コントローラのインスタンス変数をテンプレート側と共有できるのです。ただし、RailsなしでERBを使うなら、ハッシュを渡せるresult_with_hashメソッドの方がよりクリーンな解決策と言えます。

いかがでしょうか?

テンプレートエンジンの比較

それでは、各テンプレートエンジンを比較してみましょう。

これらのエンジンはすべて、Tiltというgem経由で利用できます。TiltはFaradayのようなアダプターgemです。

require 'tilt'
Tilt::ErubiTemplate.new("test.erb").render

require 'tilt/haml'
Tilt::HamlTemplate.new("test.haml").render

require 'slim'
Slim::Template.new("test.slim").render

以下は各実装のベンチマーク結果です:

Comparison:
     erubi:     5786.0 i/s
       ERB:     4438.8 i/s - 1.30x  slower
      Haml:     1340.0 i/s - 4.32x  slower
      Slim:      724.1 i/s - 7.99x  slower

HAMLの構文は次のような見た目です:

%head
  %title Ruby Templating Engines
  = 123 * 2
%body
  - foo.each do |bar|
    %p
      This Is Cool

普通のHTMLとはかなり異なるため、ある程度の慣れが必要です。

さらに簡潔に書けるのがSlimの構文です:

head
  title Ruby Templating Engines
  = 123 * 2
body
  - foo.each do |bar|
    p
      | This Is Cool

Slimは複数行のコンテンツブロックにパイプ文字「|」を使いますが、Hamlでは不要です。

次に、GitHubリポジトリの観点からも比較してみましょう:

リポジトリ スター数 最終コミット 最新リリース 作成日
jeremyevans/erubi 255 2019-11-05 14:09:06 2019-09-25 15:44:36 2016-11-10 22:42:44
haml/haml 3461 2019-12-27 10:51:59 2019-08-06 12:01:09 2008-02-11 22:55:26
slim-template/slim 4898 2019-12-15 23:55:23 2018-09-02 23:54:10 2010-09-13 01:32:07

では、どれを選べばよいのでしょうか?

結局のところ、ほとんどは個人の好みの問題だと思います。

ただ、ひとつだけ明確なことがあります

プロジェクトごとにひとつのエンジンを選び、そのプロジェクトのテンプレートはすべて同じエンジンで統一して書くことです。

複数のエンジンを混在させるのは避けましょう。

筆者はERBテンプレートを使い続けています…

適切なエディタのスニペットや補完機能があれば、余分な記述量はそれほど気になりません。

さらに、後から他のエンジンへ移行したくなったときのために、ERBとの相互変換ツールも用意されています。

まとめ

この記事では、Rubyのテンプレートエンジンについて学びました!

ERBの基本構文から、Railsなしでの単体利用、HAMLやSlimとの構文・パフォーマンス比較までを解説しました。ぜひ自分のプロジェクトに合ったエンジンを選んで活用してみてください。

最後までお読みいただきありがとうございました🙂


  1. Rubyで学ぶ挿入ソート:仕組みから計算量まで徹底解説

    ※本記事は、Rubyでさまざまなソートアルゴリズムを実装するシリーズの第4回です。第1回ではバブルソート、第2回では選択ソート、第3回ではマージソートを取り上げました。データのソート手法をさまざまな角度から探っていくシリーズもいよいよ折り返し地点。今回は挿入ソート(Insertion Sort)に焦点を当てます。挿入ソートには魅力的な特徴がたくさんあります。まず、挿入ソートは安定(stable)なアルゴリズムです。つまり、同じキーを持つ要素同士の相対的な順序が入れ替わることがありません。また、インプレース(in-place)アルゴリズムでもあるため、ソート結果を保存するための新しい配列を作成す

  2. Ruby 2.6の新機能9選|コード例でわかる注目ポイントを徹底解説

    Ruby 2.6には、開発者の生産性を高める新しい機能やパフォーマンス改善が多数盛り込まれています。 本記事では、Ruby 2.6で導入された9つの注目新機能を、実際のコード例とともにわかりやすく紹介します。最新のRuby動向をキャッチアップしたい方は、ぜひ最後までご覧ください。 1. 無限Range(Endless Range) Ruby 2.5以前でもFloat::INFINITYを使えば終端のない範囲を表現できましたが、Ruby 2.6ではさらに直感的な記法が使えるようになりました。 新しい無限Rangeは次のように書きます。 (1..) 通常のRangeが(1..10)のように終端