【发布时间】:2012-08-03 23:55:02
【问题描述】:
我正在开发一个基于在 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
这个变量不是线程安全的,所以我在放入时要小心。但我不想编写一个容易被破坏的库。谢谢。
【问题讨论】:
标签: ruby-on-rails gem before-filter applicationcontroller