02 Jun 2011
To keep codes clear, we usually put controllers with same business scope into the same directory. In most cases, these controllers will share some functions, so we can create a base controller for them for DRY.
For example, we have a list of controllers for content management:
admin content articles_controller comments_controller scores_controller other others_controller
Normally, controllers under admin directory should require current_user to be an admin, so we need to add
before_filter :admin_required for each controller. Where's the best place to do this? The "base" controller for admin.
The file structure after adding base controllers:
admin content articles_controller.rb comments_controller.rb scores_controller.rb base_controller.rb other others_controller.rb base_controller.rb
Example codes for admin/base_controller
class Admin::BaseController < ApplicationController before_filter :admin_required protected def admin_required # implementation end end
Example codes for admin/content/base_controller
class Admin::Content::BaseController < Admin::BaseController before_filter :find_article protected def find_article @article = Article.find_by_id(params[:id]) end end
For controllers under admin/content, they just need to inherit from admin/content/base_controller.
Some examples that can (and should) be put in base controllers:
- Access controll
- layout selector
- Initialize variables that will be used in most actions. (like @article in the above example)