2016-10-30 1 views
-4

ich ein Ruby-Projekt, das die folgende Architektur hat:
Project architectureMachen Sie eine geerbte Funktion dynamische

Alle meine Kind-Controller (city1, city2) erben von der übergeordneten Steuerung an der Projektwurzel. Ich habe eine Methode in der übergeordneten Steuerung:

class Controller 
    def get_directories 
    Dir.chdir(File.dirname(__FILE__) + "/") 
    Dir.glob('*').select { |f| File.directory? f } 
    end 
end 

Mein Kind-Controller:

require_relative '../controller' 

class City1Controller < Controller 
end 

und

require_relative '../controller' 

class City2Controller < Controller 
end 

Von meinem Verständnis, sieht diese Methode in dem aktuellen Arbeitsverzeichnis und gibt eine Array der Ordner, die sich in diesem Verzeichnis befinden.

Ich erwartete, dass die untergeordneten Controller diese Funktion in einer Weise erben, in der die get_directories für das untergeordnete Verzeichnis lokal sind, aber die Ordner im übergeordneten Verzeichnis angezeigt werden.

Das ist, was geschieht:

controller.get_directories => city1 city2 
city1_controller.get_directories => city1 city2 
city2_controller.get_directories => city1 city2 

Das ist, was ich passieren soll:

controller.get_directories => city1 city2 
city1_controller.get_directories => monument1 monument2 
city2_controller.get_directories => monument3 monument4 

Wenn ich genau die gleiche Methode in jedem Kind Controller (also das Überschreiben der Eltern Definition) wiederholen, es funktioniert so wie ich es möchte. Aber sollte uns das Erbe nicht ersparen?

Ist das Problem in der Methode selbst, in wie die Vererbung funktioniert, oder wie ich es benutze?

+2

Beitrag hier alles direkt

Eine Option könnte __FILE__ das Verfahren so passieren sein. Kein Teil Ihrer Frage sollte sich auf eine externe Website verlassen. Und wenn du Code hast, poste es hier als Text, nicht als Bild. – Carcigenicate

+0

Entschuldigung, ich musste beheben, welcher Teil meines Textes stackoverflow nicht mochte (gab Fehler über Code) –

+1

Das Problem ist in, wie Sie es verwenden. '__FILE__' ist keine Methode und Sie sollten kein methodisches Verhalten von ihm erwarten. –

Antwort

1

Wie Sergio bereits darauf hingewiesen: __FILE__ ist keine Methode. Es ist ein Verweis auf den Namen der aktuellen Datei, es gibt einen relativen Pfad zu genau der Datei zurück, in der es sich befindet.

class Controller 
    def get_directories(file = __FILE__) 
    Dir.chdir(File.dirname(file) + "/") 
    Dir.glob('*').select { |f| File.directory? f } 
    end 
end 

Und das Kind Controller:

require_relative '../controller' 

class City1Controller < Controller 
    def get_directories 
    super(__FILE__) 
    end 
end 

Und

require_relative '../controller' 

class City2Controller < Controller 
    def get_directories 
    super(__FILE__) 
    end 
end 
Verwandte Themen