The simplest way to install is to use Bundler.
Add this gem to your Gemfile:
gem 'themes_on_rails' If you want to use themes_on_rails with liquid template, add one more gem to your Gemfile:
gem 'liquid-rails' Then, use Bundler to install the gem and its dependencies:
$ bundle install A theme is composed of three things:
- Assets: images, javascripts, stylesheets
- Views: templates and layouts (erb, haml, or other template engines)
- Locales: locales files if any
To generate theme inside your app:
$ rails g themes_on_rails:theme theme_name app/ themes/ [theme_name]/ assets/ images/ [theme_name]/ stylesheets/ [theme_name]/ all.css javascripts/ [theme_name]/ all.js views/ layouts/ [theme_name].html.erb locales/
After you invoke the above command, make sure you restart your rails process.
It's best advisable to namespace your assets directory so that it won't conflict with assets in other themes.
image_tag 'theme_a/logo.png' # => app/themes/theme_a/assets/images/theme_a/logo.png javascript_include_tag 'theme_a/all' # => app/themes/theme_a/assets/javascripts/theme_a/all.js stylesheet_link_tag 'theme_a/all' # => app/themes/theme_a/assets/stylesheets/theme_a/all.cssThere is an example app at https://github.com/chamnap/themes_on_rails_example.
You can set theme in your controllers by using the theme declaration. For example:
class HomeController < ApplicationController theme 'basic' def index ... end endWith this declaration, all of the views rendered by the home controller will use app/themes/basic/views/home/index.html.erb as its templates and use app/themes/basic/views/layouts/basic.html.erb.
You can use a symbol to defer the choice of theme until a request is processed:
class HomeController < ApplicationController theme :theme_resolver def index ... end private def theme_resolver params[:theme].presence || 'professional' end endNow, if there is a params[:theme], it will use that theme. Otherwise, it will use professional theme.
You can even use an inline method, such as a Proc, to determine the theme. For example, if you pass a Proc object, the block you give the Proc will be given the controller instance, so the theme can be determined based on the current request:
class HomeController < ApplicationController theme Proc.new { |controller| controller.params[:theme].presence || 'professional' } endTheme specified at the controller level support the :only and :except options. These options take either a method name, or an array of method names, corresponding to method names within the controller:
class HomeController < ApplicationController theme 'basic', except: [:rss] endWith this declaration, the basic theme would be used for everything but the rss index methods.




