Rails:包括相同过滤器两次的副作用

时间:2012-08-03 23:55:02

标签: ruby-on-rails gem before-filter applicationcontroller

我正在开发一个基于在ApplicationController上使用过滤器的gem。它基本上用于日志记录,其中一个模块定义了一个像这样的周围过滤器:

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被包含两次,那么rails会将过滤器应用两次吗?

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

这个变量不是线程安全的,所以这是我要小心放入的东西。但我不想写一个容易被破解的库。感谢。

0 个答案:

没有答案