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 側でありがちな変数を書いてダメぽとかになりにくい