RubyからHAMLをテンプレートとして使う

2011-07-14
かなり古い記事です。現在も有効な内容であるかどうか分かりませんのでご注意ください。

Rails等のプレームワークだとだいたい誰かがプラグインを作っていて、それが面倒を見てくれるので意識せずにHAMLを使えるが、今回は素のRubyスクリプトから使う場合。

Haml::Engineのrenderメソッド又はrender_procメソッドを使う。

render

example.html.haml
%p= hello

変数の内容をひとつ出力するだけのあまりにシンプルなテンプレートファイル。

haml_example.rb
require 'haml'

File.open("example.html.haml") do |f|
  Haml::Engine.new(f.read, :format => :xhtml).render(Object.new, :hello => "Hello World!!")
end

Haml::Engineのインスタンスを作ってrenderする。

Haml::Engine.newの第一引数はテンプレート文字列。
このサンプルではファイルから読んでいるが、直接文字列を渡してもいい。
第二引数はオプション。詳細は割愛。

renderの第一引数はscope。ひとまずObject.newでよい。
第二引数はテンプレート変数の名前と値をハッシュで渡す。

更にブロックを取れるようだけど、どんなときにうれしいのかよくわからない。
多分役立つ局面があるんだろうけど。

実行
ruby haml_example.rb

render_proc

render_procを使うと同じテンプレートに対して変数の値を変更しつつ次々出力するような場合に便利。
部分テンプレート的に使うときなどに役立つはず。

haml_example.rb
require 'haml'

File.open("example.html.haml") do |f|
  partial = Haml::Engine.new(f.read, :format => :xhtml).render_proc(Object.new, :hello)
  ["Hello World!!", "こんにちは世界!"].each do |hello|
    p partial.call :hello => hello
  end
end

render_procの第二引数以降は変数名を渡す。
Procオブジェクトが返ってくるので、それにテンプレート変数のハッシュを渡してcallするとHTMLがレンダリングされる。

参考

Profile

フルスタック気味のフリーランスプログラマー。

どちらかと言うと得意はインフラ構築とサーバーサイドプログラミングですが、フロントエンドもぼちぼちやっています。

最近の興味範囲はWordPress、AWS、サーバーレス、UIデザイン。

愛車はセロー。カメラはペンタックス。旅好きです。横浜在住。