Rack gibt
anEine Rack-Anwendung ist ein Ruby-Objekt (keine Klasse), das auf einen Aufruf reagiert.
Folglich sieht eine einfache config.ru
wie folgt aus:
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?
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
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 ...
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.
Tags und Links ruby ruby-on-rails rack