我有一些常用的过滤器,用于两个控制器。滤波器完全相同,但是两个控制器中的跳过条件不同。
在U_u控制器中:

  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_控制器中:
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

最佳答案

你真的有两个问题,所以我将分别回答:
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:我觉得这么多动作都要跳过前置过滤器,就是一个控制器里面的前置过滤器太多了。我给您的建议是将操作分离到两个或多个控制器,并根据需要在每个控制器中的筛选器之前声明。这将省去所有skip_-before_过滤器声明。

09-04 18:41
查看更多