Warum generiert Rails eine config.ru, die eine Klasse und kein Objekt ausführt?

8

Rack gibt

an
  

Eine Rack-Anwendung ist ein Ruby-Objekt (keine Klasse), das auf einen Aufruf reagiert.

Folglich sieht eine einfache config.ru wie folgt aus:

%Vor%

während Rails dies erzeugt:

%Vor%

Also, ich frage mich: Warum nicht run RailsApp::Application.new wenn Rack angibt, dass es ein Objekt ist, keine Klasse? Gibt es etwas Besonderes an Rails::Application , das ich vermisse?

    
awendt 22.03.2013, 14:09
quelle

2 Antworten

15

Das ist in der Tat ein bisschen versteckt:)

RailsApp::Application ist eine Kindklasse von Rails::Application , die wiederum ein Rails::Engine ist, was ein Rails::Railtie ist. Jetzt hat Rails::Railtie eine inherited hook wird immer dann aufgerufen, wenn eine Kindklasse von der Railtie-Klasse erbt (in diesem Fall Engine ).

Dieser Rückruf enthält die Rails::Railtie::Configurable Modul in die Unterklasse. In diesem Modul finden Sie den ersten Teil der Magie.

Die Methode method_missing , die für die Klasse definiert wird, ruft die Methode für eine Instanz der Klasse auf, die mehr oder weniger in

aufgelöst wird %Vor%

Diese call -Instanzenmethode ist in definiert Rails::Application#call und erledigt die typische Rack-Übergabe.

Es ist wahrscheinlich noch ein bisschen mehr Magie involviert, was es nicht 100% äquivalent macht, aber das sollte ungefähr so ​​sein ...

    
Holger Just 22.03.2013, 15:00
quelle
1

Eine Klasse ist auch ein Objekt. Rack instanziiert das App-Objekt nicht (weshalb es angibt, dass Sie das Objekt bereitstellen müssen), Sie tun dies in config.ru , vorausgesetzt, das Rails-Klassenobjekt befolgt alle Rack-Regeln, wenn Rack 'call' sendet kein Problem sein.

Intern weiß ich nicht, ob Rails etwas Besonderes an call macht. Es könnte sogar eine Factory-Methode sein, die eine Instanz der Anwendungsklasse ausspuckt und ausführt. Es muss aber nicht sein, um Rack zufrieden zu stellen.

    
Neil Slater 22.03.2013 14:55
quelle

Tags und Links