長めの文字列に変数を埋め込んで生成したい場合に、ヒアドキュメントで以下のようにやっていたんですが
class ProductDecorator
def spec_table_html
<<-HTML
<table>
<tr>
<th>Height</th>
<td><%= height %></td>
</tr>
<tr>
<th>Width</th>
<td><%= width %></td>
</tr>
</table>
HTML
end
end
見づらいし、ruby内の文字列だからhtmlのシンタックスハイライト効かないしイケてないのでERB使って別ファイルにしました
ERBはrequire 'erb'
して使うんですが、Railsなら既に読み込んでると思います
使い方はこう(@hnakamurさんのコメントを受けてERB#resultに修正)
class ProductDecorator
def spec_table_html
# テンプレートファイルを開く
erb = Rails.root.join('path/to/template.html.erb').read
# ERBを走らせる
ERB.new(erb).result(binding)
end
end
最初ERB#run
の返り値がhtmlになるのかと思ったんですが何も返さなくて、結果を受け取るローカル変数の名前を渡すんですね
ERB#resultで結果を返せるんですね!
肝心の埋め込む変数なんですが、#run
の引数にBindingオブジェクトを渡すとそのコンテキストで実行してくれるのでクラス内のメソッドを使ってくれます
なんかPHPのob_start()
を思い出しました