2012-11-16 4 views
7

Dies ist, wie eine typische config/environments/*.rb Datei beginnt:Wie wird das Konfigurationssymbol in Umgebungen aufgelöst/* rb

MyApp::Application.configure do 
    config.cache_classes = false 
    ... 
end 

Der Block übergeben configure dereferenziert das Symbol config die scheinbar ungebunden ist. Wie funktioniert das technisch? Die in einem Block/Proc/Lambda verwendeten Symbole sollten im Kontext ihrer Deklaration gebunden sein und dürfen nicht im dynamischen Bereich der Aufruf-Site aufgelöst werden.

Eine verwandte Frage ist, wo genau wird die Application.configure Methode deklariert? Es ist nicht in application.rb, engine.rb oder railtie.rb. Vielleicht, wenn ich diese Methode gefunden hätte, hätte ich die Antwort auf meine Hauptfrage gefunden.

Auch verwandt, habe ich die Rails initialization procedure in quälenden Detail studiert, und ich kann nicht einmal eine Erwähnung einer config/environments/*.rb Datei finden. Wenn ich wüsste, wie diese Dateien durch das init-Verfahren behandelt wurden, könnte das ein wenig Licht ins Dunkel bringen.

Antwort

2

Es ist eine Methode config in Rails::Application im railties Juwel in lib/rails/application.rb, die eine Instanz von Application::Configuration zurückgibt, definiert in lib/rails/application/configuration.rb.

Verfahren configure wird Railtie vom Modul Configurable, lib/rails/railtie/configurable, autoload ed beigetragen und wird als

def configure(&block) 
    class_eval(&block) 
end 

definiert, der erklärt, weshalb der Block, configure kann das config Symbol akzeptiert lösen. Beachten Sie, dass class_eval eine weitere Ruby-Magie ist, die das funktioniert: Sie bindet das self Symbol des übergebenen Blocks an die Klasse der Aufruf-Site.

Überprüfen Sie die Kommentare in der ersten Datei im Abschnitt "Startvorgang", in dem erläutert wird, wo, wie und in welcher Reihenfolge all diese Informationen herkommen, einschließlich der Verarbeitung des Verzeichnisses /config/environments.

+0

Ich habe diese Datei [hier] überprüft (https://raw.github.com/rails/rails/b04ec2764f62d5734c57959e2f00f9ef4345d52e/railties/lib/rails/application.rb), aber die Suche nach 'configure' zeigt nichts. Betrachte ich eine falsche Version? –

+0

Um klar zu sein, kann ich 'config' finden, aber das erklärt nicht, wie der Block, der an' configure' übergeben wurde, diese Methode aus seinem Deklarationskontext sehen kann. Ich suche nach der 'configure' Methode, die von 'ENV.rb' aufgerufen wird. –

+1

'lib/rails/railtie/konfigurierbar # configure' ist der Hauptort, an dem diese Methode als' def configure (& block); class_eval (& Block); Ende. - Das ist der Block, nach dem du suchst, oder? –

Verwandte Themen