yield template in layout file by using erb

投稿者 okkez 2010-03-29 13:15:00 GMT

タイトルは適当。

Rails とか sinatra の tilt っぽい感じでレイアウトファイルに yield って書けるようにする方法がわかった。

レイアウトファイル。layout.html.erb

<html>
<head></head>
<body>
<%= yield %>
</body>
</html>

読み込むテンプレート。body.html.erb

<p> Hello! </p>

コード。template.rb

require 'erb'

class Template

  def initialize()
    erb = ERB.new(File.read('layout.html.erb'), nil, '-')
    erb.def_method(self.class, 'layout', 'layout.html.erb')
    erb = ERB.new(File.read('body.html.erb'), nil, '-')
    erb.def_method(self.class, 'body', 'body.html.erb')
  end

  def render
    layout{ body }
  end
end

puts Template.new.render

Template#initialize の引数を追加したりすればもう少し汎用的になると思う。 ERB#def_method の第二引数はメソッド名なのでメソッド名として使える文字列を指定しなければならない。

追記

以下のようにすると Rails の動作に少し近くなるはず。

class Template
  def render
    str = body()
    layout{ str }
  end
end

カテゴリ  | タグ  | コメントなし | トラックバックなし

コメント

トラックバック

トラックバックリンク:
http://typo.okkez.net/trackbacks?article_id=275

コメントは許可されていません