2016-11-21 4 views
1

Ich habe eine Rails-App auf meiner virtuellen Maschine. Umwelt ist Entwicklung und ich arbeite regelmäßig daran. Ich zog den Code aus dem Repo auf einem neuen Nserver, und immer mit RAILS_ENV auf development eingestellt Ich rief als erster Befehl rake db:migrate und ich bekomme, dass einer meiner Klasse NameError: nicht initialisierte Konstante.Warum bekomme ich NameError: nicht initialisierte Konstante einfach eine Rake db: Erstellen auf einer neuen Maschine

Wie ist das möglich, wenn mein Code und die Umgebung identisch sind? Autoload auf meiner virtuellen Maschine ist richtig konfiguriert, wenn es funktioniert.

config.autoload_paths << Rails.root.join('lib') 
    config.autoload_paths += Dir[Rails.root.join('app', 'api', '**', '**', '*')] 

Und die Klasse, die nicht gefunden werden kann, ist in app/api/nameofclass/anothername/api.rb.

+0

Wie haben Sie die Klassendefinition in die Datei 'app/api/nameofclass/anothername/api.rb' geschrieben? –

+0

der genaue Pfad ist: app/api/domains/DKIM/api.rb und der Name ist Domains :: DKIM :: Api – ciaoben

+0

einfach mit Ihrer Zeile anstelle von mir und läuft Rake db: create ist gibt TypeError: keine implizite Konvertierung von Array in String /var/www/qbpanel/config/environment.rb:5:in ' '. Und mit '+ =' schreibt es nicht umschreiben .. aber es verkettet die Arrays .... – ciaoben

Antwort

2

DKIM als Name verwenden wird problematisch sein, da der Autoloader, dass auf dem Weg zu d_k_i_m/ abbildet. Wann immer es möglich ist, Verzeichnisse oder Dateien mit Großbuchstaben zu erstellen, führt dies zu Chaos bei Groß- und Kleinschreibung.

app/api/domains/dkim/api.rb sollte Domains::Dkim::Api enthalten.

Wenn Sie ein nicht standardmäßiges Benennungssystem verwenden möchten, müssen Sie Ihre Dateien manuell laden, der Auto-Loader tut das nicht für Sie.

Die Autoload-Richtlinie sollte wohl sein:

config.autoload_paths << Rails.root.join('app', 'api') 

Sie wollen nicht in Ihrem Autoload Pfad einschließlich jeder einzelnen Datei sein.

+0

Es scheint zu funktionieren mit einem ersten Versuch, wird morgen mehr Versuche und markieren Sie schließlich Ihre Antwort! Vielen Dank. Eine Frage, warum derselbe Code auf meiner virtuellen Maschine funktioniert? und wo hast du gefunden, wie Schienen "DKIM" als "d_k_i_m_" interpretieren, habe ich überall gesucht – ciaoben

+0

Es könnte auch als 'dkim' interpretiert werden, kleingeschrieben. 'XyAb' wird in' xy_ab' über die Funktion 'Unterstrich' konvertiert. Ein Pfad wie "DKIM" auf einem System, bei dem Groß- und Kleinschreibung beachtet wird, funktioniert auf keinen Fall. – tadman

1

verwenden, anstatt Ihre beiden Linien:

config.autoload_paths += %W|lib app/api/**| 
Verwandte Themen