Använda rack

I den föregående artikeln lärde du dig vad Rack är. Nu är det dags att börja använda Rack och dela upp några sidor.

Hej världen

Låt oss börja med en "Hello world" -applikation. Denna applikation kommer, oavsett vilken typ av begäran den har gett, att återvända med en statuskod på 200 (som är HTTP-tala för “OK”) och strängen "Hej världen" som kroppen.

Innan du undersöker följande kod ska du igen tänka på kraven som alla Rack-applikationer måste uppfylla.

En Rack-applikation är alla Ruby-objekt som svarar på samtalsmetoden, tar en enda hash-parameter och returnerar en matris som innehåller svarstatuskoden, HTTP-svarhuvuden och svarskroppen som en rad strängar.
klass HelloWorld
def call (env)
returnera [200, , ["Hej värld!"]]
slutet
slutet

Som du kan se, ett objekt av typen Hej världen kommer att uppfylla alla dessa krav. Det gör det på ett mycket minimalt och inte särskilt användbart sätt, men det uppfyller alla krav.

WEBrick

Det är ganska enkelt, nu låt oss ansluta det till WEBrick (HTTP-servern som levereras med Ruby). För att göra detta använder vi Rack :: Handler :: WEBrick.run metod, skicka det ett exempel på Hej världen och porten att köra på. En WEBrick-server kommer nu att köras, och Rack överför förfrågningar mellan HTTP-servern och din applikation.

Observera att detta inte är ett idealiskt sätt att starta saker med Rack. Det visas bara här för att få något igång innan du dyker in i en annan funktion i Rack som heter "Rackup", som visas nedan. Att använda Rack :: Handler på detta sätt har några problem. För det första är det inte särskilt konfigurerbart. Allt är hårkodat i skriptet. För det andra, som du kommer att märka om du kör följande skript, kan du inte döda programmet. Det svarar inte på Ctrl-C. Om du kör detta kommando stänger du helt enkelt terminalfönstret och öppnar ett nytt.

#! / usr / bin / env ruby
kräver "rack"
klass HelloWorld
def call (env)
returnera [200, , ["Hej värld!"]]
slutet
slutet
Rack :: Handler :: WEBrick.run (
HelloWorld.new,
: Port => 9000
)

Rackup

Även om detta är ganska enkelt att göra, är det inte hur Rack normalt används. Rack används normalt med ett verktyg som heter rackup. Rackup gör mer eller mindre vad som låg i nedre delen av koden ovan, men på ett mer användbart sätt. Rackup körs från kommandoraden och ges en .ru “Rackup-fil.” Detta är bara ett Ruby-skript som bland annat matar ett program till Rackup.

En mycket grundläggande Rackup-fil för ovanstående skulle se ut så här.

klass HelloWorld
def call (env)
lämna tillbaka [
200,
'Content-Type' => 'text / html',
["Hej världen!"]
]
slutet
slutet
kör HelloWorld.new

Först måste vi göra en liten förändring av Hej världen klass. Rackup kör en middleware-app som heter Rack :: Lint att sanity-checkar svar. Alla HTTP-svar bör ha en Innehållstyp rubrik, så det lades till. Sedan skapar den sista raden bara en instans av appen och skickar den till springa metod. Helst ska din ansökan inte skrivas helt i Rackup-filen, den här filen ska kräva att din ansökan ingår i den och skapa en instans av det på det sättet. Rackup-filen är bara "lim", ingen riktig applikationskod ska vara där.

Om du kör kommandot rackup helloworld.ru, den startar en server på port 9292. Detta är standard Rackup-porten.

Rackup har några mer användbara funktioner. Först kan saker som porten ändras på kommandoraden eller i en speciell rad i skriptet. Ange bara en på kommandoraden -p-port parameter. Till exempel: rackup -p 1337 helloworld.ru. Från själva skriptet, om den första raden börjar med # \, sedan analyseras den precis som kommandoraden. Så du kan också definiera alternativ här. Om du ville köra på port 1337 kunde den första raden i Rackup-filen läsas # \ -p 1337.