3

before_filterカスタムクラスを使用するRuby on Rails コントローラーがあります。

class ApplicationController
  before_filter CustomBeforeFilter      
end

から継承した別のコントローラーがあり、次ApplicationControllerをスキップしたいCustomBeforeFilter:

class AnotherController < ApplicationController
  skip_before_filter CustomBeforeFilter
end

それはうまくいきません。はbefore_filterまだ実行されています。

カスタムクラスを使用するフィルターの前に Ruby on Rails をスキップするにはどうすればよいですか?

4

3 に答える 3

2

次のように、カスタム クラスをメソッドにラップするだけです。

before_filter :custom
def custom
  CustomBeforeFilter.filter(self)
end

必要な場所でそのフィルターを無効にします

于 2013-02-02T15:16:22.133 に答える
2

クラス コールバックは、フィルタ チェーンに追加されるときに、ランダムなコールバック名が割り当てられます。これを行うために私が考えることができる唯一の方法は、最初にコールバックの名前を見つけることです:

skip_before_filter _process_action_callbacks.detect {|c| c.raw_filter == CustomBeforeFilter }.filter

コントローラーでもう少しクリーンなものが必要な場合は、ApplicationController の skip_before_filter メソッドをオーバーライドして、すべてのコントローラーで利用できるようにすることができます。

class ApplicationController < ActionController::Base
  def self.skip_before_filter(*names, &block)
    names = names.map { |name|
      if name.class == Class
        _process_action_callbacks.detect {|callback| callback.raw_filter == name }.filter
      else
        name
      end
    }

    super
  end
end

次に、次のことができます。

class AnotherController < ApplicationController
  skip_before_filter CustomBeforeFilter
end
于 2013-02-02T15:31:56.420 に答える
1

最も簡単な解決策は、現在のコントローラーがスキップしたいコントローラーである場合、 before_filter メソッドから戻ることです。

class CustomBeforeFilter
  def self.filter(controller)
    return if params[:controller] == "another"
    # continue filtering logic
  end
end

編集:

次の phoet のアドバイスに従って、controller.controller_name代わりに使用することもできますparams[:controller]

于 2013-02-02T15:03:51.640 に答える