2

ApplicationController でフィルターを使用することに基づいて開発中の宝石があります。これは基本的にロギング用であり、モジュールの 1 つは次のように around フィルターを定義します。

module LogExceptionFilter
  self.included(base)
      base.around_filter :do_a_bunch_of_logging_stuff
  end

  def do_a_bunch_of_logging_stuff
      ...
  end
end

たまたま例外ログを処理するのは周りのフィルターですが、私の質問はどのフィルターにも当てはまります。

だからこんな風に使われるはず

class ApplicationController
    include LogExceptionFilter
end

だから私が心配しているのは、誰かがそうするかどうかです:

class ApplicationController
    include LogExceptionFilter
    include LogExceptionFilter
end

私は二度実行したくありませんdo_a_bunch_of_logging_stuff。だから最初に

1)do_a_bunch_of_logging_stuffが 2 回含まれている場合、レールはフィルターを 2 回適用しますか?

2)ユーザーがこれを行うのを防ぐのは私の責任ですか?次のようなクラス変数を使用してこれを行うことができます。

module LogExceptionFilter

  class << self
     cattr_accessor :filter_loaded
  end

  self.included(base)
    unless filter_loaded
      base.around_filter :do_a_bunch_of_logging_stuff
      filter_loaded = true
    end
  end

  def do_a_bunch_of_logging_stuff
      ...
  end
end

この変数はスレッドセーフではないので、慎重に入れたいところです。しかし、簡単に壊れてしまうようなライブラリは書きたくありません。ありがとう。

4

1 に答える 1

0

関連するリンクは次のとおりです。http: //www.ruby-forum.com/topic/95269 http://www.ruby-forum.com/topic/164588

基本的に、モジュールは1回だけ含まれますが、含まれるコールバックは複数回呼び出される場合があります。

于 2012-08-17T08:26:44.163 に答える