Ruby on rails Rails控制器的通用过滤器

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,

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

在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]
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一样