Donnerstag, 21. Juli 2011

Bei Rails: *kein* require

Kleiner, aber nerviger Fallstrick:

In normalem Ruby schreibt man am Anfang einer Source-Datei
require 'my_class'
um Ruby-Code aus anderen Quellcode-Dateien einzubinden.

In einer Rails-Applikation ist diese Deklaration nicht nötig, um andere Klassen der Applikation zu finden, denn Rails benutzt für das Auffinden der Applikationsklassen einen eigenen Loader.  Dadurch kann z.B. eine Controller-Klasse alle Models der Applikation ansprechen, ohne dass dafür requires gebraucht werden.

Soweit ist die Sache Rails-Entwicklern wohlbekannt. Was vielleicht nicht so bekannt ist: Eine unnötige "requires"-Anweisung zwischen den Klassen einer Rails-Applikation schadet sogar, weil sie das automatische Neuladen der Klassen im Development-Modus verhindert.

Rails löst die Abhängigkeiten zu anderen Quellcode-Dateien automatisch auf, wenn eine Klasse von Ruby nicht gefunden wird. Dabei überprüft es auch, ob die Klasse neu geladen werden muss (z.B. für den Development-Modus.)

Wenn man die Source-Datei dagegen von Hand per require einbindet, wird sie von Ruby statisch geladen, und Rails bekommt nicht mehr die Kontrolle in die Hand. Damit muss man Rails  bzw. den genutzten Webserver, nach jeder Source-Code-Änderung dieser Datei neu starten.

Keine Kommentare:

Kommentar veröffentlichen