Hvordan bruke Rack-applikasjonen i Ruby

I forrige artikkel, lærte du hva Rack er. Nå er det på tide å begynne å bruke Rack og dele opp noen sider.

Hei Verden

La oss begynne med en "Hei Verden" applikasjon. Denne applikasjonen vil, uansett hvilken type forespørsel den er gitt, returnere med en statuskode på 200 (som er HTTP-tale for "OK") og strengen "Hei Verden" som kroppen.

Før du undersøker følgende kode, må du vurdere kravene som enhver rack-applikasjon må oppfylle.

En Rack-applikasjon er ethvert Ruby-objekt som svarer på anropsmetoden, tar en enkelt hasjparameter og returnerer en matrise som inneholder responsstatuskoden, HTTP-svaroverskrifter og svarlegemet som en gruppe av strenger.
klasse HelloWorld
def samtale (env)
returner [200, {}, ["Hallo verden!"]]
slutt
slutt

Som du kan se, et objekt av typen Hei Verden vil oppfylle alle disse kravene. Det gjør det på en veldig minimal og ikke veldig nyttig måte, men den oppfyller alle kravene.

WEBrick

Det er ganske enkelt, la oss nå koble den til WEBrick (HTTP-serveren som følger med Rubin

instagram viewer
). For å gjøre dette bruker vi Rack:: Handler:: WEBrick.run metoden, pass det en forekomst av Hei Verden og havnen å kjøre på. En WEBrick-server kjører nå, og Rack vil sende forespørsler mellom HTTP-serveren og applikasjonen din.

Merk at dette ikke er en ideell måte å starte ting på med Rack. Her vises det bare for å få noe til å løpe før du dykker ned i en annen funksjon i Rack kalt "Rackup", som er vist nedenfor. Å bruke Rack:: Handler på denne måten har noen få problemer. For det første er den ikke veldig konfigurerbar. Alt er hardkodet inn i manuset. For det andre, som du vil merke hvis du kjører følgende skript, kan du ikke drepe programmet. Det vil ikke svare på Ctrl-C. Hvis du kjører denne kommandoen, lukker du bare terminalvinduet og åpner en ny.

#! / usr / bin / env ruby
krever 'rack'
klasse HelloWorld
def samtale (env)
returner [200, {}, ["Hallo verden!"]]
slutt
slutt
Rack:: Handler:: WEBrick.run (
HelloWorld.new,
: Port => 9000
)

Rackup

Selv om dette er ganske enkelt å gjøre, er det ikke slik Rack vanligvis brukes. Rack brukes normalt med et verktøy som heter rackup. Rackup gjør mer eller mindre det som var i den nederste delen av koden over, men på en mer brukbar måte. Rackup kjøres fra kommandolinjen, og gis en .ru “Rackup-fil.” Dette er bare et Ruby-skript som blant annet mater en applikasjon til Rackup.

En veldig grunnleggende Rackup-fil for de ovennevnte vil se noe slik ut.

klasse HelloWorld
def samtale (env)
komme tilbake [
200,
{'Content-Type' => 'tekst / html'},
["Hei Verden!"]
]
slutt
slutt
kjør HelloWorld.new

Først måtte vi gjøre en liten endring i Hei Verden klasse. Rackup kjører en mellomvare-app som heter Rack:: Lint som tilregnelighetskontroller svarene. Alle HTTP-svar skal ha en Innholdstype overskrift, så det ble lagt til. Deretter oppretter den siste linjen bare en forekomst av appen og gir den til løpe metode. Ideelt sett skal ikke søknaden din skrives helt innenfor Rackup-filen, denne filen må kreve at applikasjonen din er i den og opprette en forekomst av den på den måten. Rackup-filen er bare "lim", ingen ekte applikasjonskode skal være der.

Hvis du kjører kommandoen rackup helloworld.ru, vil den starte en server på port 9292. Dette er standard Rackup-port.

Rackup har noen mer nyttige funksjoner. For det første kan ting som porten endres på kommandolinjen, eller i en spesiell linje i skriptet. Bare send inn en på kommandolinjen -p port parameter. For eksempel: rackup -p 1337 helloworld.ru. Fra selve skriptet, hvis første linje starter med #\, så blir den analysert akkurat som kommandolinjen. Så du kan definere alternativer her også. Hvis du ville kjøre på port 1337, kunne den første linjen i Rackup-filen lese # \ -p 1337.