Sjungar med Sinatra

Välkommen till Spår 1 av "Sjung med Sinatra." I denna mini-serie tar vi en titt på Sinatra; en liten, men oerhört kraftfull DSL för att snabbt skapa Ruby-webbapplikationer. I den här delen kommer vi att börja med Sinatra genom att leka med några rutter, lära sig hur man får åtkomst till URL-parametrar och hur man POST-data mellan sidor.

Om du inte har arbetat med Ruby innan, bör du kolla Ruby for Newbies-sessionen, där Andrew kommer att guida dig genom processen att installera Ruby på ditt system och lära dig grunderna i språket.

Det första vi behöver göra är att installera Sinatra RubyGem. Ange följande i terminalen:

 pärla installera sinatra

Installera också "hagelgevär" pärla, som vi ska använda senare:

 pärla installera hagelgevär

Beroende på hur du har skapat RubyGems på ditt system, kan du behöva prefixa gem installation kommandon med sudo.


Den väldigt grundläggande

Öppna din textredigerare och skapa en ny fil med namnet basics.rb. Längst upp måste vi kräva RubyGems och Sinatra-pärlan:

 kräver "rubygems" kräver "sinatra"

Obs! Om du kör Ruby 1.9 (som du borde vara;)) kan du släppa kräver "rubygems" linje som Ruby laddar automatiskt RubyGems ändå.

Låt oss börja med att skapa den klassiska "Hello World". Lägg till följande i din basics.rb ansökningsfil:

 få "/" göra "Hej världen!" slutet

Detta är en "Route". Här säger vi Sinatra att om hemmet eller roten URL '/' begärs, med den vanliga GET HTTP-metoden, för att visa "Hej, Värld!"

Nu, i terminalen, låt oss starta servern genom att skriva rubin basics.rb. Vi får veta att Sinatra har "tagit scenen" på hamn 4567, och om vi går till http: // localhost: 4567 / I en webbläsare ser vi "Hej världen!".

Så låt oss försöka en annan sida:

 få '/ om' gör 'lite om mig'. slutet

När du ändrar din Sinatra-app måste du starta om servern.

Detta betyder om '/handla om' URL begärs (med hjälp av GET HTTP-metoden), "Lite om mig". kommer att visa.

När du ändrar din Sinatra-app måste du starta om servern. Så för att spara oss besväret att ständigt stoppa och starta servern under utveckling, använder vi Shotgun-pärlan som vi installerat tidigare.

Stoppa den aktuella Sinatra-servern med Ctrl-C. Nu kan vi springa hagelgevär basics.rb och Shotgun startar automatiskt servern varje gång vi uppdaterar sidan. Det här är användbart när vi gör mycket utvecklingsarbete, men eftersom hela applikationen startas om, kan det vara långsamt.

Som Shotgun lyssnar på en annan hamn, låt oss flytta till hamn 9393 och gå till http: // localhost: 9393 / om i din webbläsare. Du borde se den fras vi satt.


Åtkomst till URL-parametrar

Du kan också komma åt parametrar från webbadressen. Lägg till följande i din basics.rb fil:

 få '/ hej /: namn' gör params [: namn] slut

I det här exemplet har vi en rutt där allt efter '/Hej/' kommer att finnas i en params array med nyckeln :namn. De params array innehåller alla GET- och POST-variabler. Om du kommer från en PHP-bakgrund liknar detta $ _REQUEST global array.

I webbläsaren går du till, till exempel, http: // localhost: 9393 / hello / dan och du ska se namnet som visas tillbaka ("dan").

Du kan införliva :namn in i en sträng genom att sätta in den $ ? . Försök att byta ut params [: namn] linje med:

 "Hej där, # params [: name]."

Som du kan förvänta oss kan vi använda alla normala Ruby-metoder på variabeln, till exempel .upcase, .omvänd etc.

 "Hej där # params [: name] .upcase."

Du kan ställa in rutten för att acceptera flera variabler för fråga strängar som:

 få "/ hej /: namn /: stad" gör "Hej där # params [: namn] från # params [: city]." slutet

I likhet med normala variabler i en webbadress låter Sinatra dig inkludera hämta wildcard-frågesträngar, så kallade "splat", med hjälp av en asterisk som så:

 få '/ more / *' göra params [: splat] slutet

Något som ingår i webbadressen efter /Mer/ kommer att vara tillgängligt via : splat nyckel i params array.


Visa filer och POST

Låt oss nu göra något lite mer intressant. Låt oss skapa ett formulär för att hämta data från användaren, gör sedan något med det. Vi använder också en "visningsfil", som gör det möjligt för oss att dela upp markeringen för en vy i en separat fil. Lägg till följande väg till din basics.rb app-fil:

 få "/ form" göra erb: blankett slut

Denna rutt laddar form.erb ERB (Embedded Ruby) fil från a visningar / katalogen. ERB-filer är vanligtvis vanliga HTML-filer som låter dig inkludera Ruby-kod inuti taggar, som kommer att analyseras innan de skickas till webbläsaren - precis som hur du innehåller PHP eller ASP-kod på en webbsida.

Så skapa en visningar / katalog i samma mapp som basics.rb fil. Och inuti visningar /, skapa filen med namnet form.erb med följande innehåll inuti:

 hej från vyn

Peka på din webbläsare på http: // localhost: 9393 / formen och du borde se meddelandet vi ställde in i visningsfilen.

Nu vet vi att allting fungerar, ändra innehållet i den filen till:

 

Uppdatera sidan och du ska se formuläret:

Men ange ett meddelande i textrutan och klicka på Skicka-knappen och du kommer att se Sinatras felsida och informera oss om att det inte finns en rutt för denna URL.

Du kanske undrar varför det här är, eftersom formuläret skickar till /form, samma webbadress som formuläret är på, så det borde inte vara ett problem. Jo, skillnaden är att vi hämtar den här sidan via POST HTTP-metoden - och som du kan se på felsidan som Sinatra presenterar oss, kräver Sinatra en annan rutt för varje HTTP-metod.

Så lägg till följande väg till Sinatra app:

 posta "/ formulär" gör "Du sa" # params [: message] "" slutet

Denna rutt är för POST-metoden, inte GET. Dessutom finns alla POST-variabler tillgängliga i samma params array som GET-variabler, så vi kan hämta meddelandet som skickats med formuläret. Testa!


Du kan helt fungera för MI5 nu!

Så vad nästa? Låt oss skapa ett sätt att "kryptera" ett meddelande vi skickar så att det bara kan läsas av vår avsedda mottagare. Lägg till följande väg till Sinatra app:

 få "/ hemlig" göra erb: hemlig slut

Du kommer förmodligen att hänga med det här. Denna rutt laddar upp ERB-visningsfilen på visningar / secret.erb. Skapa den visningsfilen med följande:

 

Super Secret MI5 Message Encryptor!

Och skapa rutten för POST-metoden:

 posta "/ hemlig" gör parametrar [: hemlig] .överskridande ände

OK, så nu har vi ett meddelande krypteringsprogram som använder en speciell "omvänd" metod för att få meddelandet till synes oläsligt, vi behöver ett sätt att dekryptera meddelandet:

 få "/ dekryptera /: hemlig" gör parametrar [: hemlig] .överskridande ände

Där har du det! En superhemlig, mycket säker meddelandekrypterare som är tillräckligt bra för något lands intelligensbyrå.

Ansvarsfriskrivning: När vi säger "mycket säkra" och "kryptering", vänder vi faktiskt bara bokstäverna. Förlåt.


FourOhFour?

En sista sak vi kommer att röra på är 404 felsidor. Just nu om du går till en webbadress som det inte finns någon rutt för (t.ex.. / danisthebest), ser du Sinatras fina felmeddelande. På en riktig app skulle vi vilja visa vårt eget fel. För att göra detta, använd helt enkelt hittades inte rutt, som så:

 not_found gör status 404 "inte hittad" slut

Här använder vi Sinatras status metod för att ställa in HTTP-statuskoden för sidan till 404 (du kan använda samma metod för att ställa in någon statuskod, till exempel 201 när något skapas eller 403 när en inloggning misslyckades).

Du kan vidare refactor the hittades inte väg genom att använda Sinatras stanna metod:

 not_found stoppa 404, "sidan inte hittad" slut

Slutsats

Så du har utfört din första duett med Sinatra! Förhoppningsvis kan du se hur enkelt den här DSL gör att skapa webbapps.

På nästa spår skapar vi en enkel "att göra" app ansluten till en SQLite-databas. Vi ska också ta en titt på det förvirrande SÄTTA och Ta bort HTTP metoder som ingen hörs av.

Notera: Du kan bläddra i de slutliga projektfilerna för denna handledning på GitHub.