私は現在、すべてのサブクラスがそれぞれの関数内で呼び出すようにする関数を持つスーパークラスを持っています。この関数は、before_filter関数のように動作するはずですが、before_filterの実装方法についてはわかりません。Rubyでメソッド呼び出しを傍受するにはどうしたらいいですか?
class Superclass
def before_each_method name
p [:before_method, name]
end
def self.method_added name
return if @__last_methods_added && @__last_methods_added.include?(name)
with = :"#{name}_with_before_each_method"
without = :"#{name}_without_before_each_method"
@__last_methods_added = [name, with, without]
define_method with do |*args, &block|
before_each_method name
send without, *args, &block
end
alias_method without, name
alias_method name, with
@__last_methods_added = nil
end
end
class SubclassA < Superclass
def my_new_method
p :my_new_method
end
def my_new_other_method
p :my_new_other_method
end
end
SubclassA.new.my_new_method
SubclassA.new.my_new_other_method
これは、すぐにあなたがラップしたいメソッドを定義したようalias_method_chaining法を用いたラッパー・メソッドを作成します。ここではこれはそれを行うための一つの方法である例
class Superclass
def before_each_method
puts "Before Method" #this is supposed to be invoked by each extending class' method
end
end
class Subclass < Superclass
def my_method
#when this method is called, before_each_method method is supposed to get invoked
end
end
[Rubyのモジュール内のすべてのメソッド呼び出しのためのコードを実行する]の可能な重複(http://stackoverflow.com/questions/5513558/executing-code-for-every-method-call-in-a- ruby-module) –
IMHO別の状況と非常に良い質問です。 – lucapette
http://stackoverflow.com/questions/29785454/call-before-methods-in-model-on-ruby/29837450#29837450フレデリックのソリューション –