How to structure a layout template in Haml

Philip picture Philip · Dec 12, 2010 · Viewed 21k times · Source

I have a web page that uses Haml for layouts. "layout.haml" is a separate layout file which is used when rendering any actual Haml page.

layout.haml looks something like:

-# layout.haml
!!! XML
!!!
%html
  %head
    ...
  %body
    ...
    #content= yield

This is of course already in the document's <body> so manipulating things in the header is not directly possible. For instance <title> is changed via @title. A bigger problem is the fact that every page-specific JavaScript needs to be loaded in the body. Moreover, layout.haml already contains JavaScript, so jQuery is usually instantiated multiple times.

Are there any suggestions for a better template structure?

Answer

tjwallace picture tjwallace · Dec 12, 2010

This solution is for Ruby on Rails only:

You can use yield(:location) and the content_for(:location) methods. "Using the content_for Method" has more information.

layout.haml:

!!!
%html
  %head
    %title= yield(:title)
    = yield(:head)
  %body
    = yield

view.haml:

- content_for(:title, 'My title')
- content_for(:head) do
  = javascript_include_tag :foo

%h1 My view!