Ruby on rails Rails控制器的通用过滤器
我有一些用于两个控制器的常用过滤器。过滤器完全相同,但两个控制器中的跳过条件不同 在u_控制器中:Ruby on rails Rails控制器的通用过滤器,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我有一些用于两个控制器的常用过滤器。过滤器完全相同,但两个控制器中的跳过条件不同 在u_控制器中: before_filter :require_login,:get_notification,:get_credits skip_before_filter :require_login , :only => [:index,:registration,:login,:oauthlogin,
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]
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]
在q_控制器中:
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]
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]
在这种情况下,解决以下问题的最佳做法是什么:
在过滤器之前跳过\u
李>
避免使用
skip\u before\u filter
:使用before\u filter
中的除外
u\u控制器:
before_filter :require_login, :except => [:index,:registration,:login ....]
before_filter :get_notification, :except => [:registration,:login,:oauthlogin...]
before_filter :get_credits, :except => [:registration,:login,:oauthlogin...]
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]
q\U控制器:
before_filter :require_login, :except => [:index,:registration,:login ....]
before_filter :get_notification, :except => [:registration,:login,:oauthlogin...]
before_filter :get_credits, :except => [:registration,:login,:oauthlogin...]
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]
避免在两个控制器中重复声明过滤器:
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
您不需要它,因为对于每个控制器,您有其他函数可以跳过它们。
如果您需要将其应用于每个控制器中的每个函数,您可以在应用程序控制器的“前过滤器”中执行
注意:
如果应用它们的函数比跳过它们的函数多,我建议使用:only
,而不是:except
这里有两个问题,我将分别回答:
1:为了避免前过滤器重复,您可以将公共声明提取到模块,并将其包含在两个控制器中:
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_过滤器的原因是,在一个控制器中,它们的数量太多了。我给您的建议是将操作分离到两个或多个控制器,并根据需要在每个控制器中的筛选器之前声明。这将避免您在筛选声明之前跳过所有内容。问题很好,我自己没有答案。从专用控制器继承,实际上,你的动作名称是如此多样,我想知道为什么一个控制器会承载所有的动作名称只是出于好奇,我想知道hw是:除了优于先跳过后过滤?一行而不是两行。。。但是,如果所有控制器都有before\u过滤器
,并且在基本控制器中声明,那么我们必须使用skip
,对于跳过每个控制器中的函数…before\u filter
和except
选项类似于before\u filter+skip\u before\u filter
是否有方法跳过模块中定义的过滤器?现在重新排列控制器将是一项艰巨的任务,但我确实计划在将来移动它们。您可以在类评估块中添加跳过\u before\u filter
,就像我添加before\u filter一样