Ruby 关于过滤器 ActionController::Filters

hiveer · 2014年02月23日 · 最后由 hiveer 回复于 2014年02月24日 · 1926 次阅读
module ActionController
  module Filters
    def self.included(base)
      base.class_eval do
        extend ClassMethods
        include ActionController::Filters::InstanceMethods
      end
    end

    module ClassMethods
      def append_before_filter(*filters, &block)
        filter_chain.append_filter_to_chain(filters, :before, &block) 
      end
      alias :before_filter :append_before_filter
      # ...
     end

为什么要采用

base.class_eval do
  extend ClassMethods

而不是

base.extend ClassMethods

我觉得没有什么不同,当 base 是类级别的对象的时候;当 base 不是类级别的对象时,该对象没有 class_eval 方法,这个时候只能用 base.extend 方法。如果想 base 一定是类级别的,就用 class_eval 这种方式。

#1 楼 @googya 受教了,谢谢

需要 登录 后方可回复, 如果你还没有账号请 注册新账号