2008年 05月 29日

ERB binding layouts

http://d.hatena.ne.jp/m_seki/20080528#1211909590 を呼んでて、ナルホドナーと思いつつ、こうすることにした

body, *layouts = [<<EOB, <<EOL1, <<EOL2]
<%= foo %> and <%= bar %>
EOB
<div id="content">
	<%= content %>
</div>
EOL1
<html>
	<head>
		<title><%= title %></title>
	</head>
	<body>
		<%= content %>
	</body>
</html>
EOL2

stash = {
	:title => "foobar",
	:foo => "aaaaaaaaaa",
	:bar => "bbbbbbbbb",
}

require "ostruct"

s = OpenStruct.new(stash)
def s._render(_template)
	_template.result(binding)
end

puts layouts.inject(s._render(ERB.new(body))) {|r,i|
	s.content = r
	s._render(ERB.new(i))
}

def のシンタックス使うと内部の binding が変わってくれるので特異メソッドを def で定義してよんでみた。s._render で変数を極力使わないようにすれば、ERB 側でありがちな変数を書いてダメぽとかになりにくい