我正在开发一个基于在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
这个变量不是线程安全的,所以这是我要小心放入的东西。但我不想写一个容易被破解的库。感谢。