J'utilise la ligne suivante dans un initialiseur pour charger automatiquement le code dans mon /lib
répertoire pendant le développement:
config / initializers / custom.rb:
RELOAD_LIBS = Dir[Rails.root + 'lib/**/*.rb'] if Rails.env.development?
(à partir de Rails 3 Quicktip: Rechargement automatique des dossiers lib en mode développement )
Cela fonctionne très bien, mais il est trop inefficace pour être utilisé en production. Au lieu de charger des bibliothèques à chaque demande, je veux juste les charger au démarrage. Le même blog contient un autre article décrivant comment procéder:
config / application.rb:
# Custom directories with classes and modules you want to be autoloadable.
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]
Cependant, lorsque je passe à cela, même en cours de développement, j'obtiens NoMethodErrors lorsque j'essaie d'utiliser les fonctions lib.
Exemple d'un de mes fichiers lib:
lib / extensions.rb:
Time.class_eval do
def self.milli_stamp
Time.now.strftime('%Y%m%d%H%M%S%L').to_i
end
end
L'appel Time.milli_stamp
lancera NoMethodError
Je me rends compte que d'autres ont répondu à des questions similaires sur SO, mais ils semblent tous traiter des conventions de dénomination et d'autres problèmes dont je n'avais pas à m'inquiéter auparavant - Mes classes de lib ont déjà fonctionné pour le chargement par demande, je veux juste le changer au chargement par démarrage . Quelle est la bonne façon de procéder?
Réponses:
Je pense que cela peut résoudre votre problème:
dans config / application.rb :
et conserver la bonne convention de dénomination dans lib .
dans lib / foo.rb :
dans lib / foo / bar.rb :
si vous voulez vraiment faire des correctifs de singe dans un fichier comme lib / extensions.rb , vous pouvez l'exiger manuellement:
dans config / initializers / require.rb :
PS
Rails 3 modules / classes de chargement automatique par Bill Harding.
Et pour comprendre ce que Rails fait exactement à propos du chargement automatique?
lire le chargement automatique de Rails - comment cela fonctionne, et quand il ne fonctionne pas par Simon Coffey.
la source
config.eager_load_paths << Rails.root.join('lib')
. Cependant, cela a un inconvénient majeur en ce qu'ileager_load_paths
charge également tout dans les tâches. Je pense que la solution de lulalala est meilleure. Voici un article de blog avec plus de détails: blog.arkency.com/2014/11/…Bien que cela ne réponde pas directement à la question, mais je pense que c'est une bonne alternative pour éviter complètement la question.
Pour éviter tout
autoload_paths
oueager_load_paths
tracas, créez un répertoire "lib" ou "misc" sous le répertoire "app". Placez les codes comme vous le feriez normalement, et Rails chargera les fichiers comme il chargera (et rechargera) les fichiers de modèle.la source
app
, je dois le faire manuellement ...... ou besoin de le mettre dans le chemin d'auto-chargement ..app/views
répertoire qui n'est pas ajouté; ou plutôt est explicitement supprimé.lib
est destiné au code qui peut être appliqué à plusieurs projets et qui peut éventuellement être extrait vers un joyau. Si ce n'est pas le cas, créez un dossier plus approprié sous la recherche d'application en tant queservices/
oupresenters/
et même sous-dérivez-les.Cela pourrait aider quelqu'un comme moi qui trouve cette réponse lors de la recherche de solutions sur la façon dont Rails gère le chargement de la classe ... J'ai trouvé que je devais définir un
module
dont le nom correspondait à mon nom de fichier de manière appropriée, plutôt que de simplement définir une classe:Dans le fichier lib / development_mail_interceptor.rb (Oui, j'utilise le code d'un Railscast :))
fonctionne, mais il ne se charge pas si je n'avais pas mis la classe dans un module.
la source
LOAD_PATH/module/class.rb
(souligné) où seLOAD_PATH
trouve le chemin de chargement utilisé par l'application Ruby (autoload_paths dans le cas de Rails).lib
est passé du chargement automatique par Rails au non chargement automatique, et dans les versions récentes (> = Rails 3.x), il n'est pas chargé automatiquement. Quelle que soit la magie qui rend ce travail pour vous n'est pas recommandée. C'est peut-être un vieux Railscast?Utilisez config.to_prepare pour charger vos correctifs / extensions de singe pour chaque demande en mode développement.
fin
la source