2010-07-05 5 views
11

Ich bin neu irgendeine Art von Noob Fehler zu den Schienen und machen: Ich muss häufig die Anzahl der Zeilen in einer Datei zählen, so versuche ich, wie dieser Affe Patch Klasse File:Rails 3: Wie lade ich Dateien in/lib?

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

I speicherte dies in /lib/file_util.rb. Ich dachte, dass dies sollte automatisch erforderlich sein, so dass ich nur könnte es benutzen, aber das funktioniert nicht:

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

Also ich versuche, es manuell zu verlangen, keine Freude:

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

Aber es funktioniert, wenn ich es im IRB erfordern:

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

ich versuche auch, um das hinzuzufügen, benötigt config/application.rb:

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

require 'file_util.rb' 

module <myproj> 
... 

und ich bekomme:

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

Was mache ich falsch?

Antwort

11

Ok, ich habe es meistens herausgefunden. Rails benötigt nicht automatisch alles unter/lib. Es wird nur automatisch geladen, wenn Sie versuchen, einen neuen Klassennamen zu verwenden, der mit einem Dateinamen in lib übereinstimmt. Wenn ich also line_count in der Klasse FileUtil anstelle von File definiere, findet und lädt es automatisch 'file_util.rb'. Aber das Patchen von File und Benennen der Patch-Datei 'file.rb' funktioniert nicht, da die File-Klasse bereits definiert ist, so dass Rails nicht nach einer Definition sucht.

Mein anderes Problem war, dass ich versuchte, die Anforderung zu früh in der Startsequenz zu tun, bevor Rails hatte eine Chance zu verbessern, in seinen Verzeichnissen zu suchen. Als ich "config/environments/development.rb" "require 'file_util'" hinzugefügt habe, funktioniert es einwandfrei.

Aber das erklärt nicht, warum ich nicht manuell die Datei von der Rails-Konsole anfordern kann.

+1

Ja, die Benennung der Datei für Autoload funktionierte für mich. Wusste nicht, dass es jetzt so verkabelt war. – squarism

+1

Ich stieß auch auf dieses Problem. Dies ist, was ich tun, um automatisch alle Dateien in lib erforderlich zu machen: http://stackoverflow.com/questions/4235782/rails-3-library-not-loading-until-require/6797707#6797707 –

7

Monkeypatching-Klassen können einfacher durchgeführt werden, indem eine Datei in config/initializers hinzugefügt wird. Alle diese Dateien sind automatisch von Rails beim Start geladen.

Sie können Ihre Initialisierungsdatei beliebig aufrufen. Versuchen Sie config/initializers/file.rb.

Verwandte Themen