Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rendering A Partial / Layout With Multiple Blocks

I have a very simple requirement - I have a layout comprising of a header and body. It is a sub-layout of the page, not for the page itself.

This layout is repeated throughout multiple pages, and it is possible the structure around it will change. So I want to be able to separate the content of the header and the content of the body from the structure that contains it.

My first attempt was to use render a partial as a layout that used named yields to render a header and body:

<header class="Resource-header">
  <%= yield :resource_header %>
</header>
<div class="Resource-body">
  <%= yield :resource_body %>
</div>

Then render it from my templates like this:

<%= render layout: 'admin/resource' do %>

  <% content_for :resource_header do %>
  <% end %>

  <% content_for :resource_body do %>
  <% end %>

<% end %>

However, this renders nothing.

I started playing with the order of things, and discovered that if the content_for blocks are declared before the call to the partial, this approach does work:

<% content_for :resource_header do %>
<% end %>

<% content_for :resource_body do %>
<% end %>

<%= render layout: 'admin/resource' do %><% end %>

However this just feels incredibly hacky. It seems that content_for is scoped globally, and there is no association between the content_for block and the partial rendering.

So what is the correct way for me to achieve this?

like image 907
Undistraction Avatar asked Nov 10 '22 22:11

Undistraction


1 Answers

I just happened to have exactly same problem.

Solution is: in your partial layout file 'admin/resource' body:

<header class="Resource-header">
  <%= yield resource, :resource_header %>
</header>
<div class="Resource-body">
  <%= yield resource, :resource_body %>
</div>

in your templates do:

<%= render layout: 'admin/resource' do |resource, section| %>
  <% case section %>
    <% when :resource_header %>
      Resource header shows here.
    <% when :resource_body %>
      Resource body shows here.
  <% end %>

<% end %>
like image 128
user2954224 Avatar answered Nov 15 '22 04:11

user2954224