2009-07-18 81 views
1

在注册过滤器的抽象超类中,它们在控制器类中注册的过滤器之前。假设我想在过滤器链的最后执行一个名为authenticate的方法作为过滤器。唯一可以解决的方法是将before_filter声明为所有控制器类中的最后一个过滤器(并且其中有很多)。有没有办法在超类中声明这个过滤器,并让它最后仍然被执行?我最后要执行它的原因是控制器类可能只是针对该控制器修改身份验证要求,并且我希望在调用最终身份验证过滤器之前将这些修改考虑在内。如何在超类的过滤器链的最后添加一个过滤器?

回答

2

使用prepend_before_filter在你的控制器类,而不是before_filterappend_before_filter

0

Rails的调用你的ApplicationController第一,当地的一个前...所以你可以做这样的事情(使用为例):

在应用程序控制器,你有你before_filter回调,以及相应的方法被调用:

before_filter :authenticate 


def authenticate 
    # do something 
end 

在控制器你正在使用的资源类型...

你可以重新定义/覆盖authenticate

def authenticate 
# do something else 
end 

你甚至可以选择不使用你的authenticate回调一些方法

skip_before_filter :authenticate, :only => :my_method_without_auth 
+0

感谢您的支持,但验证方法会检查某些配额以查看当前操作是否“允许”。这些限制在应用程序控制器中调用的过滤器之前在另一个中设置。但是,假设我有一个控制器,我想要进一步更改配额,只能从控制器类触发,并且为了通过身份验证考虑这些配额,需要在设置新配额后运行身份验证,因此认证需要在控制器类中声明,然后再过滤该模块的配额。 – 2009-07-18 09:52:56

+1

为什么不用一个before_filter回调...并使用该方法来设置所需的所有内容? – mylescarrick 2009-07-19 04:11:53