Using Rails layouts is a great way to abstract away commonly rendered elements. Over the past year, I have found myself creating multiple layouts which were essentially the same, and just needed to customize a portion of the content. It’s an expensive process to maintain multiple layouts, so I decided to find a more DRY approach.
Here’s a simple solution for your layouts to provide the default content, and expose an extension point to allow your templates to override with their own content.
#app/views/layouts/application.html.haml %html %body #header - header = yield :header = header.blank? ? render(:partial => 'header') : header = yield
Now each of your views can “inherit” the default markup, or they can override the content by declaring a content_for block like so:
#app/views/posts/index.html.haml - content_for :header do .my_special_header custom content goes here
Simple, elegant and much more maintainable!