2012-11-16 10 views
7

W ten sposób zaczyna się typowym config/environments/*.rb file:Jak jest symbol config rozwiązany w środowiskach/* rb

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

Przekazany do configure blok dereferences symbol config który jest pozornie niezwiązany. Jak to działa technicznie? Symbole użyte w bloku/Proc/lambda powinny być powiązane w kontekście deklaracji, a nie pozostawione do rozstrzygnięcia w zakresie dynamicznym na stronie wywołania.

Powiązanym pytaniem jest, gdzie dokładnie została zadeklarowana metoda Application.configure? Nie jest to ani application.rb, engine.rb, ani railtie.rb. Może gdybym zdołał znaleźć tę metodę, znalazłbym odpowiedź na moje główne pytanie.

Podobne, badałem Rails initialization procedure w nieznośnych szczegółach i nie mogę znaleźć nawet wzmianki o pliku config/environments/*.rb. Gdybym wiedział, jak te pliki zostały potraktowane przez procedurę init, może to rzucić trochę światła na to.

Odpowiedz

2

Jest to metoda config w Rails::Application w gem railties w lib/rails/application.rb zwracającej wystąpienie Application::Configuration, zdefiniowany lib/rails/application/configuration.rb.

Sposób configure jest wkładem z Railtie z modułu autoload ed Configurable, lib/rails/railtie/configurable i jest zdefiniowany jako

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

co wyjaśnia dlaczego blokowym configure przyjmuje można rozwiązać config symbolu. Zauważ, że class_eval to kolejny element rubyistycznej magii, który sprawia, że ​​to działa: przywraca symbol przeniesionego bloku do postaci self do klasy strony wywołania.

Sprawdź komentarze w pierwszym pliku w sekcji Proces rozruchu, który wyjaśnia, gdzie, w jaki sposób i w jakiej kolejności pochodzi cała ta dobroć, w tym, w jaki sposób przetwarzany jest katalog /config/environments.

+0

Sprawdziłem ten plik [tutaj] (https://raw.github.com/rails/rails/b04ec2764f62d5734c57959e2f00f9ef4345d52e/railties/lib/rails/application.rb), ale wyszukiwanie 'configure' nie ujawnia niczego. Czy patrzę na złą wersję? –

+0

Aby było jasne, mogę znaleźć 'config', ale to nie wyjaśnia, w jaki sposób blok przekazany do' configure' może zobaczyć tę metodę z kontekstu deklaracji. Szukam metody 'configure', która jest wywoływana z' ENV.rb'. –

+1

'lib/rails/railtie/configurable # configure' to główne miejsce, w którym ta metoda jest zdefiniowana jako' def configure (& block); class_eval (& block); koniec. "- więc to blok, którego szukasz, prawda? –