我有两个常用的过滤器用于两个控制器。过滤器完全相同,但两个控制器中的跳过条件都不同。
在u_controller中:
before_filter :require_login,:get_notification,:get_credits
skip_before_filter :require_login , :only => [:index,:registration,:login,:oauthlogin,
:forgotpassword,:invite_mail,:newpassword,
:changepassword,:invite,:verify,:terms,:privacy,:about]
skip_before_filter :get_notification , :only => [:registration,:login,:oauthlogin,
:forgotpassword,:invite_mail,:newpassword,
:changepassword,:invite,:verify]
skip_before_filter :get_credits , :only => [:registration,:login,:oauthlogin,
:forgotpassword,:invite_mail,:newpassword,
:changepassword,:invite,:verify,:terms,:privacy,:about]
在q_controller中:
before_filter :require_login,:get_notification,:get_credits,:require_auth
skip_before_filter :get_notification,:get_credits,:require_auth,
:only => [:topic_suggest,:upload,:new_question,:qdb,:post_new_question,:evaluate_answer,:image]
skip_before_filter :require_auth, :only => [:add]
在这种情况下,解决以下问题的最佳做法是什么:
skip_before_filter
。 答案 0 :(得分:2)
你真的有两个问题,所以我会分别回答:
1:为了避免before_filter重复,您可以将常用声明提取到模块并将其包含在两个控制器中:
module BeforeFilters
def self.included(base)
base.class_eval do
before_filter :filter1, :filter2
end
end
end
class UController
include BeforeFilter
end
class QController
include BeforeFilter
end
2:我认为你必须在这么多动作中跳过before_filter的原因就是你在一个控制器中有太多这些动作。我的建议是将操作分离到两个或多个控制器,并根据需要在每个控制器中的过滤器之前声明。这将为您节省所有skip_before_filter声明。
答案 1 :(得分:1)
避免使用skip_before_filter
:在except
中使用before_filter
。
<强> u_controller:强>
before_filter :require_login, :except => [:index,:registration,:login ....]
before_filter :get_notification, :except => [:registration,:login,:oauthlogin...]
before_filter :get_credits, :except => [:registration,:login,:oauthlogin...]
<强> q_controller:强>
before_filter :require_login,:get_notification,:get_credits, :except => [:topic_suggest,:upload,:new_question,:qdb,:post_new_question,:evaluate_answer,:image]
before_filter :require_auth, :except => [:add]
避免在两个控制器中重复声明过滤器:
您不需要它,因为您有其他功能可以为每个控制器跳过它们。 如果需要为每个控制器中的每个函数应用它,可以在application_controller的before_filter中进行。
通知:
如果您有更多功能要应用它们,而不是跳过它们的功能,我建议您使用:only
代替:except
。