Layouts help you keep a common look for many pages.
content_for lets you add special parts to that layout from each page.
Layouts and content_for in Ruby on Rails
In layout file (e.g., application.html.erb): <%= yield %> <!-- main content --> <%= yield :sidebar %> <!-- named content --> In view file: <% content_for :sidebar do %> <p>Sidebar content here</p> <% end %>
yield shows the main content from views.
content_for defines extra content blocks you can place anywhere in the layout.
<!-- layout.html.erb -->
<html>
<body>
<header>Site Header</header>
<%= yield %>
<footer>Site Footer</footer>
</body>
</html>content_for :sidebar.<!-- layout.html.erb -->
<html>
<body>
<header>Site Header</header>
<%= yield %>
<aside>
<%= yield :sidebar %>
</aside>
<footer>Site Footer</footer>
</body>
</html><!-- view.html.erb --> <h1>Welcome</h1> <p>Main page content.</p> <% content_for :sidebar do %> <p>Links and info for sidebar.</p> <% end %>
This example shows a layout with a dynamic title and footer. The home page view sets a custom title and footer content using content_for. The main content appears in the <main> area.
<!-- app/views/layouts/application.html.erb --> <html lang="en"> <head> <title><%= content_for?(:title) ? yield(:title) : "Default Title" %></title> </head> <body> <header> <h1>My Website</h1> </header> <main> <%= yield %> </main> <footer> <%= yield :footer %> </footer> </body> </html> <!-- app/views/home/index.html.erb --> <% content_for :title do %> Home Page <% end %> <h2>Welcome to the Home Page</h2> <p>This is the main content area.</p> <% content_for :footer do %> <p>Contact us at contact@example.com</p> <% end %>
If you don't use content_for for a named yield, it will show nothing.
Use content_for? to check if content exists before showing it.
Layouts keep your site consistent and easy to update.
Layouts wrap your pages with shared HTML like headers and footers.
content_for lets views add special content to named spots in layouts.
This helps keep your code clean and your site consistent.
Practice
content_for in Rails layouts?Solution
Step 1: Understand the role of layouts
Layouts provide a shared structure like headers and footers for pages.Step 2: Understand
content_forusagecontent_forallows views to add content to specific named areas in the layout.Final Answer:
To insert specific content into named sections of a layout -> Option BQuick Check:
content_forinserts content into layout spots [OK]
content_for fills layout placeholders [OK]- Confusing
content_forwith layout definition - Thinking it styles pages directly
- Mixing it up with controller actions
:sidebar in a Rails view?Solution
Step 1: Recall
The correct way is to usecontent_forblock syntaxcontent_for :name do ... endwith ERB tags.Step 2: Check each option
<%= content_for :sidebar do %>Sidebar content<% end %>uses<%= content_for :sidebar do %> ... <% end %>which is correct syntax.<% content_for :sidebar = 'Sidebar content' %>tries assignment incorrectly.<%= yield :sidebar %>is for yielding, not defining.<% sidebar_content 'Sidebar content' %>is invalid.Final Answer:
<%= content_for :sidebar do %>Sidebar content<% end %> -> Option DQuick Check:
Usecontent_for :name do ... endto define content [OK]
content_for :name do ... end to define blocks [OK]- Using assignment instead of block for
content_for - Confusing
yieldwithcontent_for - Missing ERB tags or using wrong ones
<html> <body> <header><%= yield :header %></header> <main><%= yield %></main> <footer><%= yield :footer %></footer> </body> </html>
And the view code:
<%= content_for :header do %>Welcome Header<% end %>Main content here
<%= content_for :footer do %>Footer Info<% end %>
What will be rendered inside the
<main> tag?Solution
Step 1: Understand
yieldusage in layoutyieldwithout arguments renders the main view content.yield :headerandyield :footerrender named content blocks.Step 2: Identify main content in view
The main content is the part outsidecontent_forblocks:<p>Main content here</p>.Final Answer:
<p>Main content here</p> -> Option CQuick Check:
Main content = yield without args = <p>Main content here</p> [OK]
- Thinking content_for blocks appear in main yield
- Confusing named yields with main yield
- Ignoring content outside content_for
<header><%= yield :title %></header>
And this view code:
<% content_for :title = 'Page Title' %>
Why does the title not appear in the header when rendering?
Solution
Step 1: Check
The code uses assignmentcontent_forsyntax in viewcontent_for :title = 'Page Title', which is invalid syntax.Step 2: Correct usage of
content_forcontent_forrequires a block:content_for :title do 'Page Title' endorcontent_for(:title) { 'Page Title' }.Final Answer:
Becausecontent_formust use a block, not assignment -> Option AQuick Check:
content_forneeds blocks, not assignment [OK]
content_for, not assignment [OK]- Using assignment instead of block for
content_for - Forgetting to yield named content in layout
- Assuming
content_forworks in controllers
content_for and yield to achieve this?Solution
Step 1: Understand
content_for?andyieldcontent_for?(:title)checks if content was provided.yield(:title)outputs it.Step 2: Check each option for fallback logic
<title><%= content_for?(:title) ? yield(:title) : 'Default Title' %></title>uses a ternary to showyield(:title)if present, else 'Default Title'.<title><%= yield(:title) || 'Default Title' %></title>usesyield(:title) || 'Default Title'butyield(:title)returns nil if no content, so fallback works but less explicit.<title><%= content_for(:title) || 'Default Title' %></title>usescontent_for(:title)which returns nil and does not output content.<title><%= yield :title if content_for?(:title) %></title>only yields if content exists but shows nothing otherwise.Final Answer:
<title><%= content_for?(:title) ? yield(:title) : 'Default Title' %></title> -> Option AQuick Check:
Usecontent_for?to check, thenyieldor fallback [OK]
content_for?(:name) to check before yielding [OK]- Using
content_forinstead ofcontent_for?for checking - Assuming
yield(:name)returns empty string instead of nil - Not providing fallback content
Ready to prove it?
Pass the test and this pattern moves unknown
