Optional Partials in the Layout

I want to include a partial in the layout that might not exist. :o)
Here's an example: Some flows have specific CSS or JavaScript and I'd
like to automatically include those in the HTML <head> (via the
layout), so it would be great to have an optional file in called
_head.rhtml in the views that need it -- but not all views.

Does my question make sense?

- Jeremy

You could always create a partial at app/views/shared/_head.rhtml, and
include it on every page. Inside that partial you could place:

case params[:controller]
   when :application
   when :accounts

Same effect as what Daniel said, but at least all your JS/CSS stuff is
kept in one file (and you could be tricky and keep common JS/CSS above
or below the case statement to make sure it's included on every page,
leaving the blocks inside the case for the specialized JS/CSS).

Thanks for both of your suggestions. With that direction I came up
with a helper that would give me even more control.

Here's how it works. I have a directory called "shared" directly
under views -- this directory is for global partials. I can also have
a partial in the controller view directory with the same name as one
in the shared directory. For example, if I use it like this:

<%= shared :head %>

The helper will start by looking in the controller view directory for
"_head.rhtml" (i.e. views/users/_head.rhtml) and if it's not there
load up the one in the shared directory (i.e. views/shared/
_head.rhtml). You can also have it include both with the :both

<%= shared :head, :both => true %>

This way "user" pages can include more scripts and CSS in the head
than the default "shared" set. Here's my code, let me know what you


Simpliest way I have found is to do this:-

<%=render :partial=>"side_menu" rescue ""-%>

This way if you have a _side_menu.rhtml file in the controller then it
will use it otherwise display nothing.