230 votes

Fichiers de chargement automatique lib dans 4 Rails

J'utilise la ligne suivante dans un initialiseur de chargement automatique de code dans mon /lib directory en cours de développement:

config/initializers/custom.rb:

RELOAD_LIBS = Dir[Rails.root + 'lib/**/*.rb'] if Rails.env.development?

(à partir de Rails 3 Quicktip: le rechargement Automatique de lib, le mode de développement)

Il fonctionne très bien, mais c'est trop inefficace pour une utilisation en production au Lieu de chargement libs sur chaque demande, je veux juste charger au démarrage. Le même blog a un autre article décrivant comment le faire:

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, quand je passe, encore en développement, je reçois NoMethodErrors lorsque vous essayez d'utiliser la lib fonctions.

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

Appelant Time.milli_stamp lèvera NoMethodError

Je me rends compte d'autres ont répondu à des questions similaires sur mais ils ont tous l'air de traiter avec les conventions de nommage et d'autres questions que je n'ai pas à vous soucier avant - Ma lib classes déjà travaillé pour par demande de chargement, j'ai juste envie de le changer à chaquedémarrage de chargement. Quelle est la bonne façon de le faire?

549voto

ifyouseewendy Points 1848

Je pense que cela peut résoudre votre problème:

  1. dans config/application.rb:

    config.autoload_paths << Rails.root.join('lib')
    

    et de garder le droit de la convention de nommage dans lib.

    dans lib/foo.rb:

    class Foo
    end
    

    dans lib/foo/bar.rb:

    class Foo::Bar
    end
    
  2. si tu veux vraiment le faire certains singes patchs dans le fichier comme lib/extensions.rb, vous pouvez manuellement l'exigent:

    dans config/initializers/besoin.rb:

    require "#{Rails.root}/lib/extensions" 
    

P. S.

33voto

lulalala Points 3895

Bien que cela ne répond pas directement la question, mais je pense que c’est une bonne alternative pour éviter la question tout à fait.

Pour éviter tous les ou sans tracas, de créer un « lib » ou un « app » du répertoire « misc ». Placez les codes car vous feriez normalement dans il et Rails vont charger les fichiers tout comme comment il va charger (recharger) fichiers de modèle et.

6voto

sameers Points 563

Cela pourrait aider quelqu'un comme moi qui trouve cette réponse lors de la recherche de solutions à la façon dont Rails poignées le chargement de classe... J’ai trouvé que je devais définir un `` dont le nom correspond mon nom de fichier 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 elle ne se charge pas si je n’avais pas mis la classe à l’intérieur d’un module.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X