2010-11-21 6 views
23

Ich versuche, das TokBox SDK in Schienen zu laden 3. ich die Bibliothek in meinem/lib Verzeichnis abgelegt haben, so zur Zeit sieht meine Verzeichnisstruktur wie folgt:Rails 3-Bibliothek erst Laden erfordern

/lib
    opentok.rb
   /OpenTok
        Exceptions.rb
        OpenTokSDK.rb
        Session.rb

Ich bin in application.rb im Verzeichnis/lib mit den folgend alle Dateien geladen:

config.autoload_paths += %W(#{config.root}/lib) 
config.autoload_paths += Dir["#{config.root}/lib/**/"] 

Andere Dateien, ich habe in der/lib sind auto-Laden ganz gut, aber diese Bibliothek nicht geladen, bis ich ein require 'OpenTok' hinzufügen:

ruby-1.9.2-p0 > OpenTok 
NameError: uninitialized constant OpenTok 
ruby-1.9.2-p0 > OpenTok::OpenTokSDK 
NameError: uninitialized constant OpenTok 
ruby-1.9.2-p0 > require 'OpenTok' 
=> ["OpenTok"] 
ruby-1.9.2-p0 > OpenTok 
=> OpenTok 
ruby-1.9.2-p0 > OpenTok::OpenTokSDK 
=> OpenTok::OpenTokSDK 

Wie wird die Bibliothek in Rails 3 korrekt geladen?

Antwort

30

Der Autoloader wird die Konstanten Schlange legen, damit "OpenTok" den Autoloader nach "open_tok.rb", nicht nach "opentok.rb" suchen lässt. Versuchen Sie, lib/opentok.rb umzubenennen und es sollte gut funktionieren.

71

Auto-Laden funktioniert gut, solange die Klasse in Ihrer Datei eine Klasse ist, die nur in dieser Datei definiert ist. Es funktioniert nicht, wenn Sie eine vorhandene Klasse (die ursprünglich im Standard-Ruby, Rails oder einer anderen Bibliothek definiert wurde) erneut öffnen und sie auf bestimmte Weise anpassen möchten.

Beispiel Problem:

Hier ist ein Beispiel für eine Datei in lib/die nie automatisch geladen bekommen würde:

lib/active_record/base_extensions.rb:

ActiveRecord::Base # make sure ActiveRecord::Base is loaded 
module ActiveRecord::Base::Extensions 
    # some methods here 
end 

class ActiveRecord::Base 
    include ActiveRecord::Base::Extensions 
end 

Diese Datei ActiveRecord::Base wieder öffnet und fügt einige Methoden zu dieser Klasse.

Was würde diese Datei auslösen, um automatisch geladen zu werden ?? Nichts! Das automatische Laden basiert auf Konstanten, und die Konstante ActiveRecord::Base hat bereits geladen (aus dem activerecord Juwel).

Also Bezug auf die Konstante ActiveRecord::Base in Ihrer App würde nicht bewirken, dass diese bestimmte Datei automatisch geladen wird.

Umgehung:

Dies ist, was ich tun, um sicherzustellen, dass alle meine Ruby-Dateien unter lib/ erforderlich erhalten:

ein neues initializer config/initializers/require_files_in_lib.rb mit diesem Inhalt namens hinzufügen:

Dir[Rails.root + 'lib/**/*.rb'].each do |file| 
    require file 
end 
+0

Allgemein , Sie möchten 'config.autoload_paths' in Rails verwenden, damit Dateien ordnungsgemäß geladen/entladen werden können. – m33lky

+2

Ich stimme zu, das wäre im Allgemeinen eine bessere Idee, aber es ist nicht immer möglich, zum Beispiel, wenn Sie eine Datei haben, die eine * existierende * Klasse wieder öffnet, anstatt eine * neue * Klasse zu definieren. Irgendwelche Vorschläge für was in diesem Fall zu tun? –

+0

@ m33lky Ich versuche, Klassen in den lib-Ordner und Unterverzeichnisse des lib-Ordners zu laden, aber Schienen mag es nicht. Rails mag Unterordner und automatisches Laden nicht. Ich mag diese Arbeit nicht, weil sie die Klassencache umgeht, aber ich habe keine anderen Optionen. Ich beschuldige Schienen, Schienen zu sein. – Vinnyq12