Instantly share code, notes, and snippets.

Embed
What would you like to do?
Simpler nested layouts in Rails using the parent_layout helper
<%= render("shared/navbar") %>
<div class="container">
<%= render("shared/alerts") %>
<%= render("shared/page_header") %>
<%= yield %>
<%= render("shared/footer") %>
</div>
<% parent_layout "base" %>
<!DOCTYPE html>
<html>
<head>
<%= stylesheet_link_tag("application", "data-turbolinks-track" => true) %>
<%= javascript_include_tag("application", "data-turbolinks-track" => true) %>
<%= yield(:head) %>
<meta charset="utf8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<%= csrf_meta_tags %>
<title>
<%= yield(:title) + "" if content_for?(:title) %>
RailsStarter
</title>
</head>
<body>
<%= yield %>
</body>
</html>
module LayoutsHelper
# Used to achieve nested layouts without content_for. This helper relies on
# Rails internals, so beware that it make break with future major versions
# of Rails. Inspired by http://stackoverflow.com/a/18214036
#
# Usage: For example, suppose "child" layout extends "parent" layout.
# Use <%= yield %> as you would with non-nested layouts, as usual. Then on
# the very last line of layouts/child.html.erb, include this:
#
# <% parent_layout "parent" %>
#
def parent_layout(layout)
@view_flow.set(:layout, output_buffer)
output = render(:file => "layouts/#{layout}")
self.output_buffer = ActionView::OutputBuffer.new(output)
end
end
@collimarco

This comment has been minimized.

collimarco commented Apr 28, 2016

This should be added to Rails core, would be very useful

@Petecass

This comment has been minimized.

Petecass commented Dec 3, 2016

🎉 👍 👏

@romkaspb

This comment has been minimized.

romkaspb commented Jul 13, 2017

Thank you, really very useful!

@leouz

This comment has been minimized.

leouz commented Jan 16, 2018

exactly what I was looking for, thank you!

working perfectly on rails 5.1.4 👍

@fgblomqvist

This comment has been minimized.

fgblomqvist commented Sep 25, 2018

Doesn't render the output (line 14 in the helper) for me on Rails 5.1.6. As in, only the content gets rendered, not any of the templates (neither parent nor child). The correct HTML ends up in output, but is for some reason never used. Not skilled enough in Rails to know why.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment