Share some before_filters between controllers

multiple-inheritance, ruby, ruby-on-rails, ruby-on-rails-3

Solution

You could use a concern for that:

# app/controllers/concerns/my_filters.rb
module MyFilters
  extend ActiveSupport::Concern

  included do
    before_filter :filter1
    before_filter :filter2
  end

  def filter1
  end

  def filter1
  end
end

Use them through a standard `include` in your controllers:

class ApplicationController < ActionController::Base
  include MyFilters
end

class ApiController < ActionController::Metal
  include MyFilters
end

Problem

I have two parent controllers, one for an API, one for normal html pages. ``` class ApplicationController < ActionController::Base ... end class ApiController < ActionController::Metal include AbstractController::Callbacks ... end ``` I want to share some `before_filter` on both controllers. I tried something like this: ``` class ApplicationController < ActionController::Base include MyFilters end class ApiController < ActionController::Metal include MyFilters end module MyFilters before_filter :filter1 before_filter :filter2 def filter1 end def filter2 end ... end ``` And also this: ``` module MyFilters def self.included(klass) klass.before_filter :filter1 klass.before_filter :filter2 end def filter1 end def filter2 end ... end ``` But in both cases I receive: ``` undefined method `before_filter' for MyFilters:Module ``` What is the correct way to implement this?

Original source