yield template in layout file by using erb
投稿者 okkez
タイトルは適当。
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.renderTemplate#initialize の引数を追加したりすればもう少し汎用的になると思う。 ERB#def_method の第二引数はメソッド名なのでメソッド名として使える文字列を指定しなければならない。
追記
以下のようにすると Rails の動作に少し近くなるはず。
class Template
def render
str = body()
layout{ str }
end
end

