The way that I do this is with content_for. You can use
content_for_layout in your main layouts to display individual view
content (this is an alternate to yield - I think yield is
deprecated?). In the same way you can put content_for_XXX in your
layout and have that replaced as well. An example might be the
In your layout:
< if !@content_for_sidebar.blank? %>
<%= @content_for_sidebar %>
<% end %>
It is better to use <%= yield ‘sidebar’ %> instead.of <%= @content_for_sidebar %>.
In your individual views:
<% content_for ‘sidebar’ do -%>
Put some content here!
<% end %>
Note that you don’t need the if statement in the layout if you always
fill out the content_for_sidebar but in my views I often leave some
content sections empty.
If you just need to prepare data for your sidebar, you can use combination of common partial + before_filter in e.g. ApplicationController to prepare data for partial.
But if your sidebar is dependant on particular section, I would suggest using nested_layouts plugin (http://nested-layouts.rubyforge.org) and “content_for” helper (described above). So for every “section” (a group of pages with the same sidebar) you could use the same inner layout that would prepare sidebar content and wrap page content in outer (your main) layout. Take a look at nested_layouts plugin documentation - it has example of just what (I guess) you need.