Je sais que cela fait longtemps que cette question n'a pas été posée pour la première fois, mais j'ai une réponse supplémentaire que je veux partager.
J'ai plusieurs applications Ruby qui ont été développées par un autre programmeur sur plusieurs années, et elles réutilisent les mêmes classes dans les différentes applications bien qu'elles puissent accéder à la même base de données. Comme cela enfreint la règle DRY, j'ai décidé de créer une bibliothèque de classes à partager par toutes les applications Ruby. J'aurais pu le mettre dans la bibliothèque principale Ruby, mais cela cacherait le code personnalisé dans la base de code commune, ce que je ne voulais pas faire.
J'ai eu un problème où j'avais un conflit de nom entre un nom déjà défini "profile.rb" et une classe que j'utilisais. Ce conflit n'était pas un problème jusqu'à ce que j'essaye de créer la bibliothèque de code commune. Normalement, Ruby recherche d'abord les emplacements des applications, puis va vers les emplacements $ LOAD_PATH.
Le fichier application_controller.rb n'a pas pu trouver la classe que j'ai créée et a renvoyé une erreur sur la définition d'origine car ce n'est pas une classe. Depuis que j'ai supprimé la définition de classe de la section app / models de l'application, Ruby n'a pas pu la trouver là-bas et est allée la chercher dans les chemins Ruby.
J'ai donc modifié la variable $ LOAD_PATH pour inclure un chemin vers le répertoire de la bibliothèque que j'utilisais. Cela peut être fait dans le fichier environment.rb au moment de l'initialisation.
Même avec le nouveau répertoire ajouté au chemin de recherche, Ruby lançait une erreur car il prenait de préférence le fichier défini par le système en premier. Le chemin de recherche dans la variable $ LOAD_PATH recherche de préférence les chemins Ruby en premier.
Donc, j'avais besoin de changer l'ordre de recherche pour que Ruby trouve la classe dans ma bibliothèque commune avant de rechercher les bibliothèques intégrées.
Ce code l'a fait dans le fichier environment.rb:
Rails::Initializer.run do |config|
* * * * *
path = []
path.concat($LOAD_PATH)
$LOAD_PATH.clear
$LOAD_PATH << 'C:\web\common\lib'
$LOAD_PATH << 'C:\web\common'
$LOAD_PATH.concat(path)
* * * * *
end
Je ne pense pas que vous puissiez utiliser l'une des constructions de codage avancées données auparavant à ce niveau, mais cela fonctionne très bien si vous souhaitez configurer quelque chose au moment de l'initialisation dans votre application. Vous devez conserver l'ordre d'origine de la variable $ LOAD_PATH d'origine lorsqu'elle est ajoutée à la nouvelle variable, sinon certaines des principales classes Ruby sont perdues.
Dans le fichier application_controller.rb, j'utilise simplement un
require 'profile'
require 'etc' #etc
et cela charge les fichiers de bibliothèque personnalisés pour l'ensemble de l'application, c'est-à-dire que je n'ai pas à utiliser les commandes require dans chaque contrôleur.
Pour moi, c'était la solution que je recherchais, et j'ai pensé l'ajouter à cette réponse pour transmettre l'information.
File.expand_path(File.dirname(__FILE__)).tap {|pwd| $LOAD_PATH.unshift(pwd) unless $LOAD_PATH.include?(pwd)}