2010-08-06 4 views

Répondre

2

Cela peut également être effectué en n'utilisant pas le répertoire lib/, mais en stockant des classes ou des fichiers d'assistance dans le répertoire app/helpers. De cette façon, ils seront rechargés pendant le temps de développement et mis en cache pendant le temps de production.

8

Par "mise en cache des classes", je suppose que vous voulez dire que les fichiers sources dans le répertoire de l'application sont automatiquement rechargés dans l'environnement de développement avant qu'une nouvelle requête ne soit traitée?

Ceci n'est pas lié à la mise en cache, le comportement normal de Ruby est de lire et d'analyser un fichier source une fois et plus jamais tant que le processus s'exécute. Rails (ActiveSupport :: Dependencies en fait) fournit un mécanisme pour recharger tout le code avant qu'une demande ne soit traitée. Dans l'environnement de développement, cela est utile car vous ne voulez pas redémarrer le serveur Web local pour chaque modification apportée au code. Dans un environnement de production, cela nuirait gravement aux performances et est donc désactivé.

Par défaut, les classes d'application sont marquées comme rechargeables. Vous pouvez marquer des classes arbitraires à être rechargées avant qu'une demande est traitée dans un environnement de développement en utilisant la méthode de classe unloadable:

class MyClass 
    unloadable # mark this class as reloadable before a request is processed 

    # … 
end 

Prenez garde que chaque classe peut bien jouer avec le déchargement. Tant que vous définissez votre classe dans un fichier source trouvé et chargé par le mécanisme de chargement automatique de Rails, vous êtes probablement bon. Mais vous risquez de rencontrer des problèmes si vous rouvrez votre cours ailleurs afin de le monkeypatch car l'autoloading ne l'attrape pas.

+1

Pas exactement. Ce que je veux dire est que lorsque je charge une classe (en utilisant require et include) dans mon application. Ensuite, chaque fois que cette classe est utilisée sur une autre page ou une autre requête, alors les rails ne nécessitent PAS le fichier (charger le fichier) à nouveau, il utilise simplement la classe qui a été chargée auparavant (car elle reste en mémoire). Cela devient frustrant car j'ai besoin de recharger le serveur rails à chaque fois que je modifie la classe lib incluse. Je l'exécute en mode développement avec les classes de cache de configuration définies sur false. – matsko

+1

Je vois. Le mécanisme de rechargement de Rails ne fonctionne probablement que si votre classe est couverte par le chargement automatique de Rails, et non si vous en avez besoin manuellement. Je suggère de laisser votre classe charger par Rails autoloading, ce qui est très pratique de toute façon (vous n'avez pas besoin de l'exiger et ça marche partout). Si ce n'est pas possible, vous pouvez essayer d'exploiter le chargement automatique de Rails en chargeant votre fichier de classe dans un fichier qui est couvert par le chargement automatique (mais assurez-vous d'utiliser #load, pas #require, car ne nécessite qu'une seule charge) – Zargony

Questions connexes