ERB を使ってみる

Ruby でテンプレートエンジンを使ってみたいです。

Rails の Action View では ERB が使われるようです。まずは単体で ERB を使ってみたいと思います。ERB は Ruby 1.8 以降には標準で含まれているようなので require 'erb'するだけで使えました。

#!/usr/local/bin/ruby

require 'erb'

class Player
  def initialize(name, age)
    @name = name
    @age = age
  end

  def to_s
    @erb = ERB.new(DATA.read)
    @erb.result(binding)
  end
end

puts Player.new('rubyo', 19).to_s

__END__
name: <%= @name %>
age: <%= @age %>

<%= Time.now %>

ERB.new にテンプレートの文字列を渡します。ここでは __END__ 以降に書いた文字列を取得する DATA.read を使いました。便利です。

テンプレート上からアクセスするオブジェクトを、ERB インスタンスに渡す方法は他言語のテンプレートエンジンと比較するとちょっと特殊です。例えば Perl の HTML::Template や Template Toolkit では、テンプレートインスタンスuser => $user_object のような形で渡すことになりますが、ERB ではそれとは違い Kernel#binding を使って、ERB インスタンスをテンプレートに渡したいオブジェクトに組み込むような形で実装するようです。

なお、Kernel#binding は ri によると

Returns a +Binding+ object, describing the variable and method bindings at the point of call. This object can be used when calling +eval+ to execute the evaluated command in this environment. Also see the description of class +Binding+.

だそうです。binding を渡された ERB 側は、Binding オブジェクトを使って内部処理を進めているのでしょう。

このコードを実行すると

$ ruby erb.rb
name: rubyo
age: 19

Wed Apr 05 11:52:20 JST 2006

となりました。