Skip before_filter in Rails
Names and objects have been simplified for clarity's sake. The basic concept remains the same.
I have three controllers: dog
, cat
, and horse
.
These controllers all inherit from the controller animal
.
In the controller animal
, I have a before filter that authenticates a user as such:
before_filter :authenticate
def authenticate
authenticate_or_request_with_http_basic do |name, password|
name == "foo" && password == "bar"
end
end
In the show
action of dog
, I need to have open access to all users (skip the authentication).
If I were to write the authentication separately for dog
, I could do something like this:
before_filter :authenticate, :except => :show
But since dog
inherits from animal
, I do not have access to the controller-specific actions. Adding :except => :show
in the animal
controller will not only skip authentication for the show
action of dog
, but also that of cat
and horse
. This behaviour is not desired.
How can I skip the authentication only for the show
action of dog
while still inheriting from animal
?
Solution 1:
class Dog < Animal
skip_before_filter :authenticate, :only => :show
end
See ActionController::Filters::ClassMethods for more info on filters and inheritance.
Solution 2:
The two answers given are half right. In order to avoid making all your dog actions open, you need to qualify the skip_before_filter to only apply to the 'show' action as follows:
class Dog < Animal
skip_before_filter :authenticate, :only => :show
end
Solution 3:
For this you can use skip_before_filter
It's explained in the Rails API
In your example dog
just would have to contain
skip_before_filter :authenticate