Si vous tapez script/console
dans votre projet Rails et entrez $:
vous obtiendrez un tableau contenant tous les répertoires nécessaires au chargement de Ruby. L'enseignement de ce petit exercice est que $:
est un tableau. Cela étant, vous pouvez exécuter des fonctions sur ce tableau, par exemple en faisant précéder d'autres répertoires de la balise unshift
ou la méthode <<
opérateur. Comme vous l'avez laissé entendre dans votre déclaration $:
et $LOAD_PATH
sont les mêmes.
L'inconvénient de la méthode rapide et sale que vous avez mentionnée est le suivant : si vous avez déjà le répertoire dans votre chemin de démarrage, il se répétera.
Exemple :
J'ai créé un plugin appelé todo. Mon répertoire est structuré comme suit :
/---vendor
|
|---/plugins
|
|---/todo
|
|---/lib
|
|---/app
|
|---/models
|---/controllers
|
|---/rails
|
|---init.rb
Dans le fichier init.rb, j'ai entré le code suivant :
## In vendor/plugins/todo/rails/init.rb
%w{ models controllers models }.each do |dir|
path = File.expand_path(File.join(File.dirname(__FILE__), '../lib', 'app', dir))
$LOAD_PATH << path
ActiveSupport::Dependencies.load_paths << path
ActiveSupport::Dependencies.load_once_paths.delete(path)
end
Remarquez comment je demande au bloc de code d'exécuter les actions à l'intérieur du bloc sur les chaînes "models", "controllers" et "models", où je répète "models". (FYI, %w{ ... }
est juste une autre façon de dire à Ruby de contenir un tableau de chaînes de caractères). Lorsque je lance script/console
je tape ce qui suit :
>> puts $:
Et je tape cela pour qu'il soit plus facile de lire le contenu de la chaîne. La sortie que j'obtiens est :
...
...
./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/models
./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/controllers
./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/models
Comme vous pouvez le constater, bien qu'il s'agisse d'un exemple aussi simple que celui que j'ai pu créer en utilisant un projet sur lequel je travaille actuellement, si vous ne faites pas attention, la méthode rapide et sale mènera à des chemins répétés. La méthode plus longue vérifie les chemins répétés et s'assure qu'ils ne se produisent pas.
Si vous êtes un programmeur Rails expérimenté, vous avez probablement une très bonne idée de ce que vous faites et ne commettez probablement pas l'erreur de répéter des chemins. Si vous êtes un débutant, j'opterais pour le chemin le plus long jusqu'à ce que vous compreniez vraiment ce que vous faites.
2 votes
A légèrement version moins verbeuse de la version verbeuse :
File.expand_path(File.dirname(__FILE__)).tap {|pwd| $LOAD_PATH.unshift(pwd) unless $LOAD_PATH.include?(pwd)}
0 votes
Qu'en est-il de la clause "à moins que" ? Comment les deux clauses ci-dessus peuvent-elles être équivalentes ?
0 votes
En tant que personne venue ici pour essayer de comprendre comment l'utiliser, c'est super cryptique. Je ne vois pas d'où vient le nom du répertoire dans les exemples. J'apprécierais que quelqu'un puisse clarifier cela.
1 votes
Utilisation de
__dir__
(à partir de Ruby 2.0) peut rendre n'importe lequel de ces éléments plus concis.