2010-07-05 12 views
11

Sono nuovo di rotaie e facendo una sorta di niubbo errore: ho spesso bisogno di contare il numero di linee in un file, quindi sto cercando di scimmia classe patch di file in questo modo:Rails 3: come caricare i file in/lib?

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

I salvato questo in /lib/file_util.rb. Ho pensato che questo doveva essere auto-richiesta, in modo che ho potuto solo usarlo, ma che non funziona:

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

così cerco di richiedere manualmente, nessuna gioia:

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

Ma funziona se ho bisogno entro IRB:

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

ho anche cercato di aggiungere il richiedono di config/application.rb:

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

require 'file_util.rb' 

module <myproj> 
... 

e ottengo:

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

Che cosa sto facendo di sbagliato?

risposta

11

Ok, mi sembra di averlo capito per lo più. Rails non richiede automaticamente tutto sotto/lib. Viene caricato automaticamente solo quando si tenta di utilizzare un nuovo nome classe che corrisponde a un nome file in lib. Quindi, se definisco line_count nella classe FileUtil invece di File, trova e carica automaticamente 'file_util.rb'. Ma l'applicazione di patch File e la denominazione del file di correzione "file.rb" non funzionano, poiché la classe File è già definita, quindi Rails non cerca una definizione.

Il mio altro problema era che stavo cercando di eseguire la richiesta troppo presto nella sequenza di avvio, prima che Rails avesse la possibilità di migliorare richiedesse di cercare nelle sue directory. Quando ho aggiunto "require 'file_util'" a config/environments/development.rb funziona bene.

Ma questo non spiega perché non è possibile richiedere manualmente il file dalla console di rails.

+1

Sì, la denominazione del file per il caricamento automatico ha funzionato per me. Non sapevo che fosse cablato in quel modo ora. – squarism

+1

Ho incontrato anche questo problema. Questo è quello che faccio per forzare automaticamente tutti i file in lib da richiedere: http://stackoverflow.com/questions/4235782/rails-3-library-not-loading-until-require/6797707#6797707 –

7

Le classi Monkeypatching possono essere eseguite più facilmente aggiungendo un file in config/initializers. Tutti questi file sono caricati automaticamente da Rails all'avvio.

È possibile chiamare il file di inizializzazione tutto ciò che si desidera. Prova config/initializers/file.rb.