2

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

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

在这种情况下,解决以下问题的最佳做法是什么:

  1. 避免在两个控制器中重复声明过滤器
  2. 使用更简洁的代码而不是skip_before_filter.
4

2 回答 2

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 声明。

于 2013-10-20T11:50:11.247 回答
1

避免使用skip_before_filter:except在中使用before_filter

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...]

q_控制器:

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.

于 2013-10-20T11:35:37.643 回答