Back in Example 2-1, you saw that the view Rails originally generated only included an h1 element and a p element—Rails didn’t provide a full HTML document, with a DOCTYPE, html element, or head and body elements. Part of the reason for that is that Rails expects its views to work as part of a system, a system in which another document, a layout, provides all of that supporting infrastructure. Rails didn’t automatically generate a layout, but creating one is easy.


When Rails generates more complete scaffolding code (described in Chapter 5), it does produce a layout file. It just doesn’t normally do it when generating a controller and view.

Splitting View from Layout

The final version of the Hello view, still using the simple controller from Example 2-4, looks like Example 3-3.

Example 3-3. The Hello view, containing markup that can move to a layout

<head><title><%=h @message %> </title>
<%= stylesheet_link_tag 'hello', :media => "all", :type => "text/css",
:href => "/stylesheets/hello.css"  %>
<h1><%=h @message %></h1>
<p>This is a greeting from app/views/hello/index.html.erb</p>

<% for i in 1..@count %>
<p><%=h @bonus %></p>
<% end %>


To make this into a layout, break the view down into two files. The first, listed in Example 3-4, contains the logic specific to presenting that page, while the second, Example 3-5, contains the broader framing for the document. (Both are included in ch03/hello005.)

Example 3-4. The Hello view, reduced to ...

Get Learning Rails: Live Edition now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.