Ich möchte benachrichtigt werden, wenn bestimmte Dinge in einigen meiner Klassen passieren. Ich möchte dies so einrichten, dass sich die Implementierung meiner Methoden in diesen Klassen nicht ändert.Wie umgehe ich den Aufruf einer Ruby-Methode, indem ich ein Modul einschließe?
Ich dachte ich so etwas wie das folgende Modul haben würde:
class Foo
include Notifications
# notify that we're running :bar, then run bar
notify_when :bar
def bar(...) # bar may have any arbitrary signature
# ...
end
end
Mein Schlüssel Wunsch ist, dass ich nicht‘:
module Notifications
extend ActiveSupport::Concern
module ClassMethods
def notify_when(method)
puts "the #{method} method was called!"
# additional suitable notification code
# now, run the method indicated by the `method` argument
end
end
end
Dann habe ich es in meinen Klassen wie so mischen Ich möchte :bar
ändern müssen, damit Benachrichtigungen ordnungsgemäß funktionieren. Kann das gemacht werden? Wenn ja, wie würde ich die notify_when
Implementierung schreiben?
Auch ich benutze Rails 3, also wenn es ActiveSupport oder andere Techniken gibt, die ich verwenden kann, bitte zögern Sie nicht zu teilen. (Ich sah ActiveSupport::Notifications, aber das würde erfordern mir die bar
Methode zu ändern.)
es zu meiner Aufmerksamkeit gekommen ist, dass ich will vielleicht „die Module + Super-Trick“ verwenden. Ich bin mir nicht sicher, was das ist - vielleicht kann mich jemand aufklären?
Was passiert, wenn: Methode nimmt einen Block? –
Sie müssen 'define_method' nicht verwenden, Sie können ein' eval' verwenden, um die Methode zu definieren. Z.B. 'eval" def # {methode} (* args, & block) ... ' –
Dies setzt voraus, dass 'notify_when' nach der Methodendefinition kommt, also wird es in Ihrem Codebeispiel nicht funktionieren. Auch * modifiziert * die' Leiste "Methode. Aber abgesehen von der Verwendung eines Proxy-Objekts haben * Sie * Ihre Methoden zu ändern (schmücken). – horseyguy