Controller Supports are controller oriented mixins (modules) for Rails that can help you extract behaviour from controllers into shared resources.
Why?
Controller Supports lets you extract common behaviour or non-core controller knowledge into it's seperate resource which makes it easier to test and maintain. Some example of ControllerSupports:
- UserSupport - Authentication and current_user
- ErrorSupport - Global error methods and a before filter to catch uncaught exceptions
-
EventSupport - Used to load the event resource based on the
params[:id]
- LocalizationSupport - Helper methods to build hashes that will be passed to I18n
- MobileSupport - Check if in a mobile session and change the layout
ControllerSupports are just an extension of ActiveSupport::Concern
so they supply all of the behaviours that you'd get from ActiveSupport::Concern
.
What Controller Supports adds on top of ActiveSupport::Concern is an easier way to define methods as helper_methods
and before_filters
. It does so in such a way that will enable you to include
the support in controllers but also into other objects like test stubs or Mailers.
If you don't know ActiveSupport::Concern
there are several links to reading material in the bottom of this README.
Installation
Just add the controller_support
gem to your Gemfile
gem 'controller_support'
Usage
To define a module as a controller support you just need to extend it with ControllerSupport::Base
it can then act as a mixin which you can include
into Controllers or any other object.
module UserSupport
extend ControllerSupport::Base
helper_method :current_user, :user_signed_in
before_filter :must_be_signed_in
# ControllerSupport also support after_filter and around_filter
def current_user
@user ||= User.find(session[:user_id])
end
def user_signed_in?
current_user.present?
end
def must_be_signed_in
redirect_to sign_up_path unless user_signed_in?
end
end
To use the support just include
it in the controller of your choice
class ItemController < ApplicationController
include UserSupport
skip_before_filter :must_be_signed_in, :only => :new
def new
render :inline => "this is just an example"
end
def show
current_user.item.find(params[:id])
end
end
ActiveSupport::Concern reading material
If you don't know about ActiveSupport::Concern and why it's an awesome thing you should read these stuff
- The official documentation
- Concerning yourself with ActiveSupport::Concern - This blog post covers everything you need to know
- Concerning ActiveSupport::Concern
- Extending ActiveModel via ActiveSupport::Concern
- Trimming the fat from your controllers - A blog post I wrote that led to the creation of this gem.
License
This project rocks and uses MIT-LICENSE.