2

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 つのコントローラーでフィルターの重複宣言を避ける
  2. の代わりに、よりクリーンなコードを使用してくださいskip_before_filter
4

2 に答える 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 をスキップしなければならない理由は、1 つのコントローラーにあまりにも多くのアクションがあるためだと思います。アクションを 2 つ以上のコントローラーに分け、必要に応じて各コントローラーでフィルターの前に宣言することをお勧めします。これにより、すべての skip_before_filter 宣言が省略されます。

于 2013-10-20T11:50:11.247 に答える
1

skip_before_filter: use exceptinの使用は避けてください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_コントローラー:

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]

2 つのコントローラーでフィルターを重複して宣言しないようにします。

コントローラーごとにスキップする別の関数があるため、必要ありません。各コントローラーの各関数に適用する必要がある場合は、application_controller の before_filter で実行できます。

注意: それらをスキップする関数よりも適用する関数の方が多い場合は、:only代わりに を使用することをお勧めし:exceptます。

于 2013-10-20T11:35:37.643 に答える