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
となりました。