35 Stimmen

Ruby-Mixins und der Aufruf von Supermethoden

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?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X