SimplestView gives us the power to split Rails Views out from our Templates
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


SimplestView splits up Views and Templates (erb/haml/etc) in a Rails 3/4 application to make it easier to improve the code quality of our controllers, and remove code from helper modules.

This is accomplished by replacing the anonymous class that inherits from ActionView::Base with your own view class. This view class becomes the context within your existing Rails Templates.

Build Status Code Climate


Add this line to your application's Gemfile:

gem 'simplest_view'

And then execute:

$ bundle

Or install it yourself as:

$ gem install simplest_view


  1. Inside of your ApplicationController or a specific controller: include SimplestView
  2. Inside of any Mailers you have (inherited from ActionMailer::Base): include SimplestView
  3. mv app/views app/templates
  4. mkdir app/views
  5. append app/views to the Rails autoload_paths inside of application.rb

To Add a View

Inside of app/views, create directories for your controllers. Within each controller directory, create a view to match the actions in your controller.

For a controller named PostsController with actions :index, :show, :edit you could create app/views/posts/index_view.rb, app/views/posts/show_view.rb, app/views/posts/edit_view.rb respectively.

Then, create your view by inheriting from ActionView::Base:

class Posts::IndexView < ActionView::Base

Any methods defined within will be accessible from your matching templates at app/templates/posts/index.html.erb, etc.

NOTE: If you do not create a view class, the default rails behavior will continue to work as always!

Handling new & create

If you have a new action in the PostsController, like so:

def new

This will implicitly render the app/templates/posts/new.html.erb template, and will look for the view inside app/views/posts/new_view.rb.

If you also have a create action:

def create
    redirect_to ...
    render :new

When this attempts to render the new template, it will not try to look for a view inside app/views/posts/new_view.rb because we are only rendering the new template, but we are inside of the create action still. Put your view inside of app/views/posts/create_view.rb.

If the views are exactly the same, I have simply made the constants equal, like so: Posts::CreateView = Posts::NewView.

This will apply to any template and view that you render from another action. Another common example is edit/update.


  1. figure out how to test the integration with rails
  2. generate to move new template generation into app/templates, and to generate view clases as needed.


  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request