开发者

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
  authentica开发者_JAVA百科te_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?


class Dog < Animal
  skip_before_filter :authenticate, :only => :show
end

See ActionController::Filters::ClassMethods for more info on filters and inheritance.


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


For this you can use skip_before_filter

It's explained in the Rails API

In your example dogjust would have to contain

skip_before_filter :authenticate


Just a small update that using rails 4, it is now skip_before_action :authenticate, :only => :show and that before_filters should now use before_action instead.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜