为了清楚起见,简化了名称和对象。基本概念保持不变。
我有三个控制器:dog
,cat
和horse
。
这些控制器都继承自控制器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}}操作的身份验证,还会跳过show
和dog
的身份验证。这种行为是不可取的。
如何在仅继承cat
的情况下,仅针对horse
的{{1}}操作跳过身份验证?
答案 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)
答案 3 :(得分:2)
只是使用rails 4的一个小更新,它现在是skip_before_action :authenticate, :only => :show
,而before_filters现在应该使用before_action
。