Global rails partials

Done right

One of the most common practices I've seen in rails is to have an app/views/shared folder and render partial: “shared/my_partial”.

There is nothing wrong with this, but it is unnecessary. Ruby on Rails has a default convention to look for partials in app/views/application. If you rename your shared folder to the application, you can save yourself some characters and just type render partial: “my_partial”.

How did I end up here?

Well, I tried to render a partial that didn't exist and found myself with the following error:

<%= render partial: "missing_partial" %>
Missing partial pages/_missing_partial, application/_missing_partial with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby]}. Searched in: * "/Users/mhenrixon/Code/mhenrixon/railsapp/app/views"

Aha! I requested the root page, which resides in the pages controller, so it checks the app/views/pages/ first for that partial, but what is the second one? app/views/application/ after a few minutes of research, it was clear from the rails documentation that:

The lookup order for an admin/products#index action will be:

  • app/views/admin/products/

  • app/views/admin/

  • app/views/application/

This makes app/views/application/ a great place for your shared partials, which can then be rendered in your ERB as such:

<%# app/views/admin/products/index.html.erb %>
<%= render @products || "empty_list" %>

<%# app/views/application/_empty_list.html.erb %>
There are no items in this list <em>yet</em>.