これは何やってるんだ?
module ActionController #:nodoc: module Filters #:nodoc: def self.included(base) base.class_eval do extend ClassMethods include ActionController::Filters::InstanceMethods end end
今日は、before_filterを使った。で、ActionController::Filtersの中を覗いてみると、初級RailsプログラマーのRuby知らずには、分からないコードが。。。
で、読んでみると。
self.included(base): Filtersモジュールが、誰かにincludeされた時に呼ばれるコールバック。includeしたクラスがbaseとして渡されてくるので、class_evalを使って、クラスを変更したりできる。
分からないのが次の2行。extendとinclude。どちらも、何となく似たことをしているように思える。
extendはbaseクラスに、ClassMethodsというモジュールの中のメソッドを付け加える。
includeも、指定されたモジュールのメソッドをクラスに付け加える(mixin)。
何故、extendとincludeの2つの方法を使わないといけないのか?
で、暫くお勉強した結果、includeによるmixinは、クラスにinstance methodsを付け加えることしかできない。一方、extendはターゲットのオブジェクトインスタンスにメソッドを付け加えることができる。extendが呼ばれた時のターゲットのインスタンスは、includeしているクラス(クラスオブジェクト)だから、結果として、クラスメソッドを付け加えることになる。