Ok, donc j'ai été refactoring mon code dans mon application Rails, dans un effort pour éliminer les doubles emplois, et, en général, rendre ma vie plus facile (que j'aime une vie facile). Le cadre de ce remaniement, a été de passer le code qui est commune à deux de mes modèles à un module que je peut comprendre où j'en ai besoin.
Pour l'instant, donc bon. On dirait que ça va fonctionner, mais je viens de frapper un problème que je ne suis pas sûr de la façon de se déplacer. Le module (que j'ai appelé pouvant être envoyées), va juste être le code qui gère l'envoi de télécopie, e-mailing, ou l'impression d'un fichier PDF du document. Ainsi, par exemple, j'ai un ordre d'achat, et j'ai Internes, les Ordres de Vente (imagination abrégé de l'ISO).
Le problème que j'ai frappé, c'est que je veux que certaines variables initialisées (initialisé pour les personnes qui n'ont pas l'orthographier correctement :P ) après que l'objet est chargé, donc j'ai été en utilisant le after_initialize crochet. Pas de problème... jusqu'à ce que j'ai commencer à ajouter un peu plus mixin.
Le problème que j'ai, c'est que je peux avoir un after_initialize
dans une de mes mixin, j'ai donc besoin d'inclure un super appel au départ pour que l'autre mixin after_initialize
des appels appelée. Ce qui est génial, jusqu'à ce que je finis par appeler super et j'obtiens une erreur car il n'est pas super à l'appel.
Voici un petit exemple, dans le cas où je n'ai pas été assez déroutant:
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
Donc, si chacun de le mixin ont un after_initialize appel, avec un super appel, comment puis-je arrêter cette dernière super appel de collecte de l'erreur? Comment puis-je tester que la super méthode existe avant que je l'appelle?