Multiple Yields in an ERB Template
When you setup a new Rails project, you'll have a single layout file which has a single default yield
block. This will soon be inadequate, and you'll want another. Here's how to setup multiple yield
blocks per ERB template.
Layout File
By default, Rails will create a file at:
app/views/layouts/application.html.erb
In this file, there will be a default yield
block similar to this:
<%= yield %>
It has no name. It's just the default place for templates that use this layout file to put their content.
We can create new yield
blocks. We'll have to give them a distinguishing name. They look about the same. If I wanted to create a new yield
block where, for instance, alerts could be displayed if the child template had them, I could put this in my layout file:
<%= yield(:alert) %>
Now I would just need something to go in it.
Child Templates
A child template that uses the application.html.erb
layout file can just start blasting out markup that will go into the default yield
block. This will usually be the main content. But in our example, there might be more focused content such as alerts that we want to display in a separate area. Thus, our template could potentially look like this:
<h1>My main content</h1>
<p>Bacon ipsum…<p>
<% content_for :alert do %>
<div class="alert alert-success">
You created multiple yield blocks!
</div>
<% end %>
Throw down a content_for
block, matching the name of the yield
block in your layout file, and you're set. Order does not matter. Your specific content_for
blocks can come before, after, or in the middle of your main content. Easy as Ruby pie.