14 Stimmen

Warum aktualisiert Rails die Klassen nicht bei jeder Anfrage (trotz Konfiguration)?

Seit kurzem muss ich meinen Entwicklungsserver jedes Mal neu starten, wenn ich meinen Code ändere. Meine development.rb Datei hat immer noch diese Zeile:

config.cache\_classes = false

Ich habe versucht, mit dem Debugger zu überprüfen, dass dieser Wert geblieben ist. Um dies zu tun, setzte ich meine Konfiguration auf eine globale Variable in environment.rb:

$my\_initializer = Rails::Initializer.run do |config|
  ...
end

dann habe ich eine debugger Leitung in einem meiner Controller, damit ich dies tun kann:

(rdb:2) $my\_initializer.configuration.cache\_classes
false

Damit wurde die Möglichkeit ausgeschlossen, dass der Wert von cache_classes wurde eingestellt auf true irgendwo anders. Ich habe versucht, sowohl Mongrel als auch WEBrick zu verwenden, und es passiert immer noch.

Was könnte noch dazu führen, dass Rails meinen Code nicht bei jeder Anfrage neu lädt?

Ich bin auf der Flucht: Mongrel 1.1.5
WEBrick 1.3.1
Rails 2.3.8
Ruby 1.8.7 p253

EDIT: auf Vorschlag von @Daemin habe ich überprüft, dass die mtime meiner Dateien tatsächlich aktualisiert wird, wenn ich sie in meinem Texteditor (Textmate) speichere

merced:controllers lance$ ls -l people\_controller.rb 
-rwxr-xr-x  1 lance  staff  2153 Act 10 18:01 people\_controller.rb

Dann habe ich eine Änderung vorgenommen und die Datei gespeichert:

merced:controllers lance$ ls -l people\_controller.rb 
-rwxr-xr-x@ 1 lance  staff  2163 Oct 11 12:03 people\_controller.rb

Es handelt sich also nicht um ein Problem mit den Uhrzeiten.

11voto

muirbot Punkte 2061

Es stellt sich also heraus, dass config.threadsafe! überschreibt die Wirkung von config.cache_classes = false auch wenn es nicht wirklich die Wert von cache_classes (siehe meine Frage zum Beweis). Graben Sie ein wenig mehr in den Rails-Quellcode könnte erhellen, warum dies sein könnte, aber ich brauche eigentlich nicht threadsafe Verhalten in meiner Entwicklungsumgebung. Stattdessen ersetzte ich meinen Aufruf an config.threadsafe! in environment.rb zu

config.threadsafe! unless RAILS\_ENV == "development"

und alles funktioniert jetzt einwandfrei.

5voto

Claw Punkte 757

Ich vermute, dass die Klassen, die Sie zu aktualisieren erwarten, irgendwo in Ihrer Konfiguration "erforderlich" sind. Beachten Sie, dass das Laden von Abhängigkeiten in Rails nach Ruby's require s sind geschehen. Wenn ein bestimmtes Modul oder eine Klasse bereits benötigt wird, wird es vom Rails-Abhängigkeitslader nicht behandelt und daher nicht neu geladen. Eine detaillierte Erklärung finden Sie in diesem Artikel: http://spacevatican.org/2008/9/28/required-or-not

2voto

WattsInABox Punkte 4408

Trotz der Tatsache, dass die threadsafe!-Lösung funktioniert, wollte ich auch darauf hinweisen, für Ihren Nutzen und die anderen, die in nach dem folgenden kommen kann ...

Wenn Sie Motorcode bearbeiten, der sich direkt in Ihrem vendor/engines-Verzeichnis befindet, werden diese Dateien nicht ohne einen Neustart aktualisiert. Möglicherweise gibt es eine Konfigurationsoption zur Aktivierung dieser Funktion. Es ist jedoch sehr wichtig, dies zu beachten, wenn Sie

0voto

Daemin Punkte 9867

Meine Vermutung wäre, dass die Klassen nicht bei jeder Anfrage neu geladen werden, weil sie sich zwischen den Anfragen nicht geändert haben. Das System würde also die zuletzt geänderte Zeit notieren, wenn die Klassen geladen werden, und sie erst dann neu laden, wenn sich diese geändert hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X