在Rails中跳过before_filter

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

我有三个控制器: dogcathorse 。 这些控制器都从控制器animalinheritance。 在控制器animal ,我有一个用于validation用户的filter:

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

dogshow行动中,我需要对所有用户开放访问(跳过authentication)。

如果我要为dog单独编写validation,我可以这样做:

 before_filter :authenticate, :except => :show 

但是,由于doganimalinheritance的,我没有访问控制器的具体行为。 在animal控制器中join:except => :show不仅可以跳过对dogshow动作的authentication,还可以跳过cathorseshow动作。 这种行为是不希望的。

在inheritanceanimal同时,我怎样才能跳过只用于dogshow动作的authentication?

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

有关filter和inheritance的更多信息,请参阅ActionController :: Filters :: ClassMethods 。

给出的两个答案是一半的权利。 为了避免让所有的狗动作都打开,您需要限定skip_before_filter,以便仅应用于“show”操作,如下所示:

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

为此,您可以使用skip_before_filter

这在Rails API中有解释

在你的例子中, dog需要包含

 skip_before_filter :authenticate 

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