Ok, so habe ich refactoring meinen Code in meinem kleinen Rails app in dem Bemühen, Duplikation zu entfernen, und im Allgemeinen mein Leben einfacher machen (wie ich ein einfaches Leben). Ein Teil dieser Umstrukturierung war es, Code, der für zwei meiner Modelle gemeinsam ist, in ein Modul zu verschieben, das ich dort einfügen kann, wo ich es brauche.
So weit, so gut. Es sieht so aus, als würde es funktionieren, aber ich bin gerade auf ein Problem gestoßen, bei dem ich mir nicht sicher bin, wie ich es umgehen soll. Das Modul (das ich sendable genannt habe), wird nur der Code sein, der das Faxen, E-Mailen oder Drucken einer PDF-Datei des Dokuments behandelt. So habe ich zum Beispiel eine Bestellung, und ich habe interne Kundenaufträge (phantasievoll abgekürzt ISO).
Das Problem, auf das ich gestoßen bin, ist, dass ich einige Variablen initialisiert (initialisiert für Leute, die nicht richtig schreiben :P ) haben möchte, nachdem das Objekt geladen wurde, also habe ich die nach_der_Initialisierung Haken. Kein Problem... bis ich anfange, einige weitere Mixins hinzuzufügen.
Das Problem, das ich habe, ist, dass ich eine after_initialize
in einem meiner Mixins, also muss ich eine super Aufruf am Anfang, um sicherzustellen, dass das andere Mixin after_initialize
werden angerufen. Das ist großartig, bis ich am Ende Super aufrufe und eine Fehlermeldung erhalte, weil es keinen Super zum Aufrufen gibt.
Hier ist ein kleines Beispiel, falls ich noch nicht verwirrend genug war:
class Iso < ActiveRecord::Base
include Shared::TracksSerialNumberExtension
include Shared::OrderLines
extend Shared::Filtered
include Sendable::Model
validates_presence_of :customer
validates_associated :lines
owned_by :customer
order_lines :despatched # Mixin
tracks_serial_numbers :items # Mixin
sendable :customer # Mixin
attr_accessor :address
def initialize( params = nil )
super
self.created_at ||= Time.now.to_date
end
end
Wenn also jedes der Mixins einen after_initialize-Aufruf hat, mit einem super Anruf, wie kann ich den letzten Anruf stoppen? super Aufruf vom Auslösen des Fehlers abhalten? Wie kann ich testen, ob die Supermethode existiert, bevor ich sie aufrufe?