Hur man använder Rack-applikationen i Ruby

I föregående artikel, du lärde 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 "Hej världen" Ansökan. Denna applikation kommer, oavsett vilken typ av begäran den har gett, att returnera 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 grupp av 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, låt oss nu ansluta den till WEBrick (HTTP-servern som medföljer

instagram viewer
Rubin). För att göra detta använder vi Rack:: Handler:: WEBrick.run metod, passera det en instans av 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 en applikation 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:: ludd 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 bör din ansökan inte skrivas helt i Rackup-filen, den här filen måste kräva att din ansökan ingår i den och skapa en instans av det på så sätt. Rackup-filen är bara "lim", ingen riktig applikationskod ska vara där.

Om du kör kommandot rackup helloworld.ru, kommer det att starta en server på port 9292. Detta är standardporten för Rackup.

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 det 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.