2010-12-16 14 views
10

Ich möchte eine Methode zu einem Rails-Modell hinzufügen, die beim Testen verwendet werden soll. Wenn ich dies tunRuby/Rails: Reopening vs Überschreiben einer Klasse

class Model 
    def something_new 
    do_something 
    end 
end 

in der Rails-Konsole oder in einer Datei zur Laufzeit geladen, Modell eher überschrieben als modifiziert. Wenn ich etwas wie v = Model.class vor die obigen Zeilen setze, wird die neue Methode erfolgreich zu der bestehenden Klasse hinzugefügt. Offensichtlich wird die Referenz benötigt, um anzuzeigen, dass eine existierende Klasse wieder geöffnet wird.

Auf der anderen Seite kann man zB Fixnum eine Methode hinzufügen, ohne dass man sich zuerst darauf beziehen muss. Was passiert hier und wie kann man dafür sorgen, dass eine bestehende Klasse wieder geöffnet und verändert wird, anstatt sie zu überschreiben?

Danke.

Antwort

11

Es klingt, als würden Sie die Klasse nicht benötigen, bevor Sie sie verwenden. Wenn Sie Model.class schreiben und es keine Model-Klasse gibt, bringt Rails automatisch das Model für Sie ein. Wenn Sie nur class Model schreiben, sieht es das als Klassendefinition. Just do require 'model' sollte funktionieren.

+0

Danke, das war das Problem. Als ich sah, dass Model-Klasse bereits erkannt wurde, war mir nicht bewusst, dass es nur "automatisch" erkannt wurde. –

4

Verwenden Sie class_eval, damit Sie die Klasse wieder richtig öffnen.
Hier ist ein sehr guter Artikel auf reopening classes.

+0

Danke. Es ist ein guter Artikel. –

Verwandte Themen