Theme For Rails (3 and hopefully later)

Features list / Wish list

  • Support for adding themes which includes stylesheets, javascripts, views and layouts.

      views/           <- you can override application views
        layouts/         <- layout .rhtml or .liquid templates


Add themes_for_rails to your Gemfile.

gem 'themes_for_rails'

Add themes_for_rails to your config/routes.rb

MySuperDuperApp::Application.routes.draw do
  # ...
  # ...

And then?

Now you’ll be able to use themes like this:

Inside method, for some explicit action:

class MyController < ApplicationController
  def show
    theme "purple"

Or at class level definition, in order to set a theme for more than one action. I think this is is prettier, and less invasive.

class MyController < ApplicationController
  theme "purple" # all actions will use this theme
  def show

You could also enable a theme for some actions only

class MyController < ApplicationController
  theme "purple", :only => :show
  def show
    # with theme
  def edit
    # no theme

As a plus, you could do this to defer theme name resolution to a method:

class MyController < ApplicationController
  theme :theme_resolver
  # ...
  def theme_resolver
    current_user.theme # or anything else that return a string. 

As a general rule, when passing a String, that becomes the theme name, but when a Symbol is sent, it gets treated as method message.

Action Mailer integration:

As a plus, you can use it from Action Mailer too (thanks to rafaelss) like this:

class MyMailer < ActionMailer::Base

  def notify_someone
    mail :theme => "blue" , :to => ""


Or set the theme by default like this (thanks to maxjgon):

class MyMailer < ActionMailer::Base

  default :theme => "blue"
  def notify_someone
    mail :to => ""


Url Helpers

In your views you should be able to access your assets like this (given the theme ‘default’ is set):

current_theme_image_path('logo.png')   # => /themes/default/images/logo.png
current_theme_stylesheet_path('style') # => /themes/default/stylesheets/logo.css
current_theme_javascript_path('app')   # => /themes/default/stylesheets/app.js

Or a given theme:

current_theme_image_path('logo.png', 'purple')   # => /themes/purple/images/logo.png

In your application views, there are theme specific helper tags available to you. For ERb templates they are:



For now, it only creates the theme folder and add the “themes_for_rails” route in the routes.rb.

rails generate themes_for_rails:install  

Inside the themes folder, it create a structure for my_theme.

rails generate themes_for_rails:theme my_theme  

Changing things

At least for now, you can change the ThemesForRails base dir in your app, in the corresponding environment file, or in your application.rb file. Do it like this:

KillerApp::Application.configure do
  config.themes_for_rails.base_dir = File.join(Rails.root, "tmp")


Thanks to matheusca, now you can change the name of the theme’s dir.

KillerApp::Application.configure do
  config.themes_for_rails.themes_dir = "another_themes"


Sass support

ThemesForRails will automatically add the themes paths to Sass, if sass is available.

For instance, everything you put inside themes/my_theme/stylesheets/sass will get compiled into themes/my_theme/stylesheets (duh, right?)

To bypass sass configuration, do this:

KillerApp::Application.configure do
config.themes_for_rails.use_sass = false

Another way to change things

If you don’t like this approach and prefer something more like an initializer file, you could create one an put something like this.

# Rails.root/config/initializers/themes_for_rails.rb (for instance)
ThemesForRails.config do |config|
  config.themes_dir = 'another_themes'
  # ...

Notes and Warnings.

If you are running an app in production mode, and you get the static files with no content, is because you don’t have X-senfile enabled at your web server.

You can do two things:

comment out this line in your production.rb file:

config.action_dispatch.x_sendfile_header = “X-Sendfile”


configure your web server to use it. :)


Read it here


  • Add ThemesForRails::Railtie for configuration, so we selectively set the plugin on or off. Also to be able to change several settings.
  • Add routes to allow access to the theme’s static resources (js and cs), unless cached on public folder by capistrano / rake.
  • Extend Action View path in order to make the views accessible. Same for the layouts.
  • More tests ford edge cases. Now I am only testing the happy paths.

Things to remember.

  • Final version should be a gem. Initialization hooks doesn’t work when using this as a plugin (vendor/plugins).
  • Research about testing this kind of gem. I really don’t have a clue. Testing in place!
  • I should probably load the theme list at start time, to be able to consult it as needed. I am gonna need that when dealing with runtime theme selection. Many themes are going to be used simultaneously, so I have to be able to switch view paths as fast as I can.

Rails 2 Support

This gem only works with Rails 3 (duh). If you want the same exactly behavior, but for Rails 2.x, go here .

Running tests

gem install bundler
bundle install

Authors and contributors

  • lucasefe
  • jbarreneche
  • kule
  • matheusmoreira
  • rafaelss
  • maxjgon

Last but not least

If you are using this gem, please, take a minute to recommend me at Working With Rails.

Recommend Me