I have multiple controllers that all use an identical before_filter. In the interests of keeping things dry, where should this method live so that all the controllers can us
How about putting your before_filter and method in a module and including it in each of the controllers. I'd put this file in the lib folder.
module MyFunctions
def self.included(base)
base.before_filter :my_before_filter
end
def my_before_filter
Rails.logger.info "********** YEA I WAS CALLED ***************"
end
end
Then in your controller, all you would have to do is
class MyController < ActionController::Base
include MyFunctions
end
Finally, I would ensure that lib is autoloaded. Open config/application.rb and add the following to the class for your application.
config.autoload_paths += %W(#{config.root}/lib)
Place the before_filter in the shared superclass of your controllers. If you have to go so far up the inheritance chain that this winds up being ApplicationController, and you are forced to apply the before_filter to some controllers it shouldn't apply to, you should use skip_before_filter in those specific controllers:
class ApplicationController < ActionController::Base
before_filter :require_user
end
# Login controller shouldn't require a user
class LoginController < ApplicationController
skip_before_filter :require_user
end
# Posts requires a user
class PostsController < ApplicationController
end
# Comments requires a user
class CommentsController < ApplicationController
end
If it is common to all controllers, you may put it in the application controller. If not, you can create a new controller and make it the superclass of them all and put the code in it.
Something like this can be done.
Class CommonController < ApplicationController
# before_filter goes here
end
Class MyController < CommonController
end
class MyOtherController < CommonController
end