J'utilise des rails 3.2.2 et je veux charger tout le code dans un présent répertoire de manière récursive. Par exemple: sur la base de Googling, j'ai essayé: p> Aucune de ces chargements de la charge et je reçois "une constante ininitialisée" "Erreurs. p> Ce chargement des fichiers directement dans mise à jour < / p> merci pour les commentaires. p> i Mettez ceci dans mon le Lancements d'applications, mais les classes déclarées dans ma bibliothèque ne sont pas disponibles: p> / my_lib / code>, mais pas sous-répertoires: p>
application.rb code>: p>
4 Réponses :
Les chemins d'autoload doivent être des chemins explicites - ils ne peuvent pas contenir de fichiers globs (Wildcards).
Par conséquent, vous devrez faire l'expansion d'abord: P>
Dir["#{Rails.root.to_s}/lib/my_lib/**/*.rb"].each do |path|
config.autoload_paths += [path]
end
Est-ce différent de la suggestion de Ben Miller, ci-dessus? Ça ne marche pas pour moi. Encore obtenir "une constante non initialisée". (Aussi, + = code> semble fonctionner uniquement avec un autre tableau, il semble donc que cela doit être + = [Fichier] code>, sinon je reçois "Impossible de convertir la chaîne dans le tableau) ".
Vous avez raison. Il manquait le [] code> autour du chemin. L'erreur "constante non initialisée" serait due au nom de fichier non correct pour la classe référencée.
Oui, quand j'ai eu mes noms de fichiers et de classe triés, cela a fonctionné. Merci.
E.g. Si un fichier Donc, si vous voulez seulement charger chacun de vos fichiers car ils sont nécessaires, vous devrez alors nommer Vos fichiers en conséquence et avoir un fichier par classe. P> Si vous êtes heureux de charger tous les fichiers d'un arborescence de répertoire lorsque les rails commencent, vous pouvez le faire: P> autoload_paths CODE> et des amis ne fonctionne que si les fichiers donnés ou les fichiers dans les répertoires donnés sont nommés en fonction des rails nommant Convention. quelque_class.rb code> est donné à autoload_paths code>, il dépasse le fichier pour déclarer une classe soméclass code> et monte une magie pour faire Référence à SOMECLASS code> Chargez ce fichier à la volée. p> Dir.glob("/path/to/my/lib/**/*.rb").each { |f| require f }
Notez qu'il existe une période de démarrage et une pénalité de mémoire pour le faire. L'AutoLoad a pour objectif de ne pas charger les classes à la demande. Si ce n'est pas vraiment nécessaire, alors par tous les moyens, mettez le code ci-dessus dans une initialiseur et être fait avec elle!
C'est la bonne réponse! Convention est ce que j'avais manqué :)
Aussi vous pouvez essayer.
Application.rb: P>
config.autoload_paths += %W( #{config.root}/app/model/super_model )
config.autoload_paths += %W( #{config.root}/lib )
Voici un moyen plus simple d'ajouter tout le répertoire libernel qui ne nécessite pas se référer à Réponse de @Michael Slade pour un résumé agréable de ce qu'AfoLoading fait p> p> . Cochez code> et se sent plus simple que les autres réponses
dir ["# {rails.root.to_s} / lib / my_lib / ** / *. RB"]. Chaque {| x | Exiger x} code>Une modification mineure de la suggestion de Niklas, modifie l'exigence de configuration.Autoload_Paths + = x
AutoToLoad de la question: Stackoverflow.com/Questtions/4074830/...