/ devise

Easy filters for Devise controllers

Here's a way to add filters to your controllers without subclassing the Devise controllers.

For example, I have a prepare_something method that I want to apply as a before_filter to all of the Devise controller actions.

First, create a module in config/initializers/devise_filters.rb where we’ll implement a method to add all the filters to Devise that we want. We also need to make sure this module calls this method upon initialization so that our filters get added upon startup (this is important for the production environment).

 # Put this somewhere it will get auto-loaded, like config/initializers
module DeviseFilters
  def self.add_filters
    # Example of adding a before_filter to all the Devise controller actions we care about.
    [
      Devise::SessionsController,
      Devise::RegistrationsController,
      Devise::PasswordsController
    ].each do |controller|
      controller.before_filter :prepare_for_mobile
    end
    # Example of adding one selective before_filter.
    Devise::SessionsController.before_filter :void_my_sessions, :only => :destroy
  end
  self.add_filters
end

We need an extra setting to make it work for development mode because in development mode each request reloads all the Devise classes and all our filters are gone.

To address this, we need to add a bit of code to the end of the initializer block in config/environments/development.rb

 # Add this in your development.rb
MyApp::Application.configure do
  config.to_prepare do
    DeviseFilters.add_filters
  end
end

This tells Rails to call your DeviseFilters.add_filters method before each new request in development mode, after the classes have been reloaded.

In production mode, controller classes gets cached at start of application, so above snippet wont be needed for production mode.