在Rails中跳过before_filter

时间:2010-03-05 21:50:58

标签: ruby-on-rails inheritance before-filter

为了清楚起见,简化了名称和对象。基本概念保持不变。

我有三个控制器:dogcathorse。 这些控制器都继承自控制器animal。 在控制器animal中,我有一个before过滤器,用于对用户进行身份验证:

before_filter :authenticate

def authenticate
  authenticate_or_request_with_http_basic do |name, password|
    name == "foo" && password == "bar"
  end
end

show的{​​{1}}操作中,我需要对所有用户具有开放访问权限(跳过身份验证)。

如果我要为dog分别编写身份验证,我可以这样做:

dog

但由于before_filter :authenticate, :except => :show 继承自dog,因此我无法访问特定于控制器的操作。在animal控制器中添加:except => :show不仅会跳过animal的{​​{1}}操作的身份验证,还会跳过showdog的身份验证。这种行为是不可取的。

如何在仅继承cat的情况下,仅针对horse的{​​{1}}操作跳过身份验证?

4 个答案:

答案 0 :(得分:111)

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

有关过滤器和继承的详细信息,请参阅ActionController::Filters::ClassMethods

答案 1 :(得分:12)

给出的两个答案是对的。为了避免让您的所有狗行动都开放,您需要限定skip_before_filter以仅适用于'show'操作,如下所示:

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

答案 2 :(得分:3)

为此你可以使用skip_before_filter

Rails API

中对此进行了解释

在您的示例dog中,只需要包含

skip_before_filter :authenticate

答案 3 :(得分:2)

只是使用rails 4的一个小更新,它现在是skip_before_action :authenticate, :only => :show,而before_filters现在应该使用before_action