2010-07-05 8 views
11

Je suis nouveau sur les rails et de faire une sorte d'erreur noob: Je dois souvent compter le nombre de lignes dans un fichier, donc je suis en train de fichier de classe patch singe comme ceci:Rails 3: comment charger les fichiers dans/lib?

class File 
    def self.line_count(filename) 
    %x{wc -l #{filename}}.split.first.to_i 
    end 
end 

I enregistré cela dans /lib/file_util.rb. Je pensais que cela était censé être nécessaire automatiquement, de sorte que je pouvais l'utiliser, mais cela ne fonctionne pas:

$ rails console 
>> File.line_count('Gemfile') 
NoMethodError: undefined method `line_count' for File:Class 
... 

J'essaie donc d'exiger manuellement, pas de joie:

>> require '<myproj>/lib/file_util.rb' # same result with require 'file_util.rb' 
=>nil 

Mais cela fonctionne si je le redemanderai au sein de la CISR:

$ irb 
>> require '<myproj>/lib/file_util.rb' 
=> true 
>> File.line_count('Gemfile') 
=> 22 

J'ai aussi essayé d'ajouter le besoin de config/application.rb:

... 
Bundler.require(:default, Rails.env) if defined?(Bundler) 

require 'file_util.rb' 

module <myproj> 
... 

et je reçois:

$ rails console 
<myproj>/config/application.rb:9:in `require': no such file to load -- file_util.rb (LoadError) 

Qu'est-ce que je fais mal?

Répondre

11

Ok, il semble que je l'ai surtout compris. Rails n'exige pas automatiquement tout sous/lib. Il ne se charge automatiquement que lorsque vous essayez d'utiliser un nouveau nom de classe qui correspond à un nom de fichier dans lib. Donc, si je définis line_count dans la classe FileUtil au lieu de File, il trouve automatiquement et charge 'file_util.rb'. Mais patcher le fichier et nommer le fichier patch 'file.rb' ne fonctionne pas, puisque la classe File est déjà définie, donc Rails ne cherche pas de définition.

Mon autre problème était que j'essayais de faire le requérir trop tôt dans la séquence de démarrage, avant que Rails ait une chance d'améliorer exiger de regarder dans ses répertoires. Lorsque j'ai ajouté "require 'file_util'" à config/environments/development.rb cela fonctionne très bien.

Mais cela n'explique pas pourquoi je ne peux pas demander manuellement le fichier depuis la console rails.

+1

Oui, le nom du fichier à charger automatiquement a fonctionné pour moi. Je ne savais pas qu'il était câblé de cette façon maintenant. – squarism

+1

J'ai aussi rencontré ce problème. C'est ce que je fais pour forcer automatiquement tous les fichiers en lib nécessaires: http://stackoverflow.com/questions/4235782/rails-3-library-not-loading-until-require/6797707#6797707 –

7

Il est possible de créer plus facilement des classes de superposition en ajoutant un fichier au config/initializers. Tous ces fichiers sont automatiquement chargés par Rails au démarrage.

Vous pouvez appeler votre fichier d'initialisation comme vous le souhaitez. Essayez config/initializers/file.rb.