Ruby on rails 在Rails中过滤之前跳过

Ruby on rails 在Rails中过滤之前跳过,ruby-on-rails,inheritance,before-filter,Ruby On Rails,Inheritance,Before Filter,为了清晰起见,名称和对象已简化。基本概念保持不变 我有三个控制器:狗,猫,和马。 这些控制器都继承自控制器动物。 在控制器animal中,我有一个对用户进行身份验证的before过滤器: before_filter :authenticate def authenticate authenticate_or_request_with_http_basic do |name, password| name == "foo" && password == "bar"

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

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

before_filter :authenticate

def authenticate
  authenticate_or_request_with_http_basic do |name, password|
    name == "foo" && password == "bar"
  end
end
show
dog
操作中,我需要对所有用户开放访问(跳过身份验证)

如果我要为
单独编写身份验证,我可以这样做:

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


如何仅跳过
显示
狗的
动作的身份验证,而仍从
动物继承

这在报告中有解释

在您的示例中,
dog
必须包含

skip_before_filter :authenticate
class狗:显示
结束

有关筛选器和继承的更多信息,请参阅。

给出的两个答案是正确的一半。为了避免打开所有狗狗动作,您需要将“先跳过后跳过”过滤器限定为仅适用于“显示”动作,如下所示:

class Dog < Animal
  skip_before_filter :authenticate, :only => :show
end
class狗:显示
结束

只是一个小的更新,使用rails 4,它现在是
在操作之前跳过:验证,:only=>:show
和before\u filter现在应该改为使用
before\u action

before\u filter
似乎被弃用>>他们建议一起使用
skip\u filter
调用
before\u filter
跳过\u filter
跳过\u filter
。否不是。。他们只是将方法移动到另一个类,这应该是一个注释。
class Dog < Animal
  skip_before_filter :authenticate, :only => :show
end