【问题标题】:Rails: side effect of including the same filter twiceRails:两次包含相同过滤器的副作用
【发布时间】: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


    【解决方案1】:

    以下是一些相关链接: http://www.ruby-forum.com/topic/95269 http://www.ruby-forum.com/topic/164588

    基本上,一个模块只会被包含一次,但被包含的回调可能会被多次调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-25
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      • 2018-02-27
      • 2023-01-22
      相关资源
      最近更新 更多