クラス メソッド (監査可能) に渡されたオプションをインスタンス メソッドで使用できるようにしたいと考えています。モジュールを使用して、クラス メソッドとインスタンス メソッドの両方を混在させています。
当然の選択はクラス変数を使用することですが、アクセスしようとするとエラーが発生します。
Auditable 内の初期化されていないクラス変数 @@auditable_only_once
class Document
include Auditable
auditable :only_once => true
end
# The mixin
module Auditable
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def auditable(options = {})
options[:only_once] ||= false
class_eval do
# SET THE OPTION HERE!!
@@auditable_only_once = options[:only_once]
end
end
end
private
def audit(action)
# AND READ IT BACK LATER HERE
return if @@auditable_only_once && self.audit_item
AuditItem.create(:auditable => self, :tag => "#{self.class.to_s}_#{action}".downcase, :user => self.student)
end
end
これを少し読みやすくするためにコードの一部を削除しました。完全なコードは次のとおりです: https://gist.github.com/1004399 (編集: Gist にソリューションが含まれるようになりました)