2015-01-31 8 views
8

ist Immer, wenn ich einen Code (außer Ansichten und vielleicht einige Controllern) ändern, die ich erhalte:Eine Kopie des MyModel wird aus dem Modulbaum entfernt wurde, aber immer noch aktiv

Eine Kopie des MyModel aus dem Modul entfernt wurde Baum aber ist immer noch aktiv!

und ich muss meinen Dev-Server neu starten.

Ich habe die Interwebs in diesem Problem gekämmt, und die am häufigsten angegebene Ursache ruft MyModel.some_method aus einer Klasse, die nicht automatisch geladen wird. Ich habe Klassen in lib, die wie MyModel.find anrufen und MyModel.some_scope; Ich habe jedoch Rails so konfiguriert, dass jede Datei im Baum lib automatisch geladen wird. Ich ging so weit, das Autoloading von allem zu konfigurieren, einschließlich jeder Datei irgendwo unter app und sogar config.

Eine Tatsache, die relevant sein könnte, ist, dass MyModel die Basis einer STI-Hierarchie ist. Es hat zwei Kinder, und eines hat ein Kind.

Dies wird mich verrückt fahren, weil ich keine Ideen mehr dafür haben, wie es zu beheben. Inzwischen ist die Produktivität in die Hölle gegangen.

Wie finde ich die Quelle davon?

Antwort

3

Es bedeutet, dass Ihre App immer noch Referenzen auf die alte Version hat. Ich denke, es sollte von der Stapelspur genau dort sichtbar sein, wo es referenziert wird.

auch, fügen Sie nicht lib automatisch zu laden, wenn es es wäre automatisch geladen werden soll. Ich weiß nicht, was dieses Modell ist, aber möglicherweise sollten Sie es in app/services oder app/models (egal ob ActiveRecord oder nicht).

+1

zumindest für mich, ich sah nicht viel von einem Stack-Trace in hebeln, bis ich den 'wtf ???' Befehl verwendet. –

1

Ich stieß auf das gleiche Problem. Im Grunde ist es durch alte Referenzen verursacht wird, wenn Rails neu zu laden versucht, wahrscheinlich passieren, um verschachtelte Module/Klassen wie folgt:

module A 
    def self.b 
    B 
    end 
end 

class C 
    def d 
    @d ||= D.new 
    end 
end 

Sie müssen aktualisieren Sie es an:

module A 
    def self.b 
    self::B # or A::B 
    end 
end 

class C 
    def d 
    @d ||= C::D.new 
    end 
end 

Also in Ihrem In diesem Fall muss jedes Modul/Klasse NestedModuleOrClass unter MyModel auf MyModel::NestedModuleOrClass aktualisiert werden.

Versuchen Sie dies und lassen Sie mich wissen, ob es für Sie arbeitet oder nicht.

Verwandte Themen