7
votes

Qu'est-ce qu'un bon moyen d'exiger un arbre de répertoire entier dans les rails?

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: xxx

sur la base de Googling, j'ai essayé: xxx

Aucune de ces chargements de la charge et je reçois "une constante ininitialisée" "Erreurs.

Ce chargement des fichiers directement dans / my_lib / , mais pas sous-répertoires: xxx


mise à jour < / p>

merci pour les commentaires.

i Mettez ceci dans mon application.rb : xxx

le Lancements d'applications, mais les classes déclarées dans ma bibliothèque ne sont pas disponibles: xxx


3 commentaires

dir ["# {rails.root.to_s} / lib / my_lib / ** / *. RB"]. Chaque {| x | Exiger x}


Une modification mineure de la suggestion de Niklas, modifie l'exigence de configuration.Autoload_Paths + = x


AutoToLoad de la question: Stackoverflow.com/Questtions/4074830/...


4 Réponses :


2
votes

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


3 commentaires

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, + = semble fonctionner uniquement avec un autre tableau, il semble donc que cela doit être + = [Fichier] , sinon je reçois "Impossible de convertir la chaîne dans le tableau) ".


Vous avez raison. Il manquait le [] 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.



11
votes

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.

E.g. Si un fichier 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>

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>

Dir.glob("/path/to/my/lib/**/*.rb").each { |f| require f }


2 commentaires

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é :)



0
votes

Aussi vous pouvez essayer.

Application.rb: P>

  config.autoload_paths += %W( #{config.root}/app/model/super_model )
  config.autoload_paths += %W( #{config.root}/lib )


0 commentaires

3
votes

Voici un moyen plus simple d'ajouter tout le répertoire libernel qui ne nécessite pas . Cochez et se sent plus simple que les autres réponses xxx

se référer à Réponse de @Michael Slade pour un résumé agréable de ce qu'AfoLoading fait


0 commentaires