Je suis en train de mettre en œuvre une hooker pour les méthodes de classe, quelque chose comme before_action
et after_action
. Le problème est si je définir une méthode l'intérieur du module, avec define_method
ou normalement avec def do_before; puts 'do_before called'; end
à l'intérieur method_added
obtient non défini. Alors, comment puis-je appeler un module method
intérieur method_added
?méthode d'auto module appelé Undefined method_added
module Hooker
[:before, :after].each do |element|
define_method("#{element}_action") do |name|
puts "#{element}_action called with parameter #{name}"
end
define_method("do_#{element}") do
puts "do_#{element} called"
end
end
def method_added(name)
return if @filtering # Don't add to original_ methods
@filtering = true
alias_method :"original_#{name}", name
define_method name do |*args|
do_before # undefined method `do_before' for #<Bar:0x007ff2f183c318>
self.send("original_#{name}", *args)
do_after # undefined method `do_after' for #<Bar:0x007ff2f183c318>
end
@filtering = false
end
end
class Bar
extend Hooker
before_action 'foo2'
after_action 'bar2'
def my_func
puts 'MyFunc called'
end
end
Bar.new.my_func
fonctionne parfaitement, mais est-il possible/astuce pour ne pas avoir à faire les 2 étapes dans la classe? Peut-être utiliser self.extended ou hérité? –
Je ne sais pas, mais jetez un coup d'oeil sur [Module # précédez] (http://ruby-doc.org/core-2.0.0/Module.html#method-i-prepend), Un grand avantage de ce pouvoir est pour remplacer les méthodes d'une manière plus sûre, plutôt que d'utiliser un alias ou des astuces comme alias_method_chain. codage heureux! –
Ne pas tirer ... Essayé avec ce 'def self.extended (base); base.send: include, self; fin »mais ne fonctionne toujours pas. –