First a simple solution using throw_content and catch_content.
This is what sublayout.html.erb looks like
<% throw_content :sublayout do %>
<div class="header">
...
</div>
<%= catch_content :for_layout %>
<div class="footer">
...
</div>
<% end %>
<%= render catch_content(:sublayout), :layout => "application" %>
Your main layout contains <%= catch_content :for_layout %> as usual.
You might find it handy to use catch and throw content in a few more places. For example, in your sublayout you could <%= catch_content :sublayout_title %> and throw it in the view with
<% throw_content :sublayout_title %>
Hippos
<% end %>
As a little bonus I wrote a helper so that you can use the same syntax as you're used to from the rails plugin. Just add this snippet into Merb::GlobalHelpers
def inside_layout(layout, &block)
content = render(capture(&block), :layout => layout)
concat(content, block.binding)
end
Then your sublayout looks like
<% inside_layout :sublayout do %>
<div class="header">
...
</div>
<%= catch_content :for_layout %>
<div class="footer">
...
</div>
<% end %>
Here's another idea which I think would be even better: What if you could say layout ['application', 'sublayout'] in your controller and have each layout rendered inside it's parent all up the chain? Then sublayout.html.erb wouldn't be constrained to always render inside application.html.erb and you could use it in a much more flexible way. However Damien things it's a mad idea. What do you think?
