Cantando con Sinatra

Benvenuto nella traccia 1 di "Cantare con Sinatra". In questa mini-serie daremo un'occhiata a Sinatra; un DSL piccolo ma incredibilmente potente per la creazione rapida di applicazioni Web Ruby. In questa parte, inizieremo con Sinatra giocando con alcuni percorsi, imparando come accedere ai parametri URL e come inviare i dati POST tra le pagine.

Se non hai mai lavorato con Ruby, dovresti dare un'occhiata alla sessione Ruby for Newbies, in cui Andrew ti guiderà attraverso il processo di installazione di Ruby sul tuo sistema e l'apprendimento delle basi della lingua.

La prima cosa che dobbiamo fare è installare Sinatra RubyGem. Inserisci quanto segue nel terminale:

 gemma installa sinatra

Installa anche la gemma "shotgun", che useremo in seguito:

 gem installare shotgun

A seconda di come è stato configurato RubyGems sul sistema, potrebbe essere necessario inserire il prefisso gem installazione comandi con sudo.


The Very Basics

Apri il tuo editor di testo e crea un nuovo file chiamato basics.rb. Proprio in cima dobbiamo richiedere RubyGems e la gemma Sinatra:

 richiedere 'rubygems' richiedono 'sinatra'

Nota: se stai usando Ruby 1.9 (che dovresti essere;)), puoi eliminare il file richiedere 'rubygems' linea come Ruby carica automaticamente RubyGems comunque.

Iniziamo creando il classico "Hello World". Aggiungi il seguente al tuo basics.rb file dell'applicazione:

 prendi "/" fai "Ciao, Mondo!" fine

Questa è una "Route". Qui, stiamo dicendo a Sinatra che se la home, o root, URL '/' è richiesto, utilizzando il normale metodo GET HTTP, per visualizzare "Hello, World!"

Ora, nel terminale, iniziamo il server digitando ruby basics.rb. Ci è stato detto che Sinatra ha "preso il palcoscenico" sul porto 4567, e se andiamo a http: // localhost: 4567 / in un browser, vediamo "Hello, World!".

Quindi proviamo un'altra pagina:

 prendi '/ about' fai 'Un po' di me. ' fine

Ogni volta che apporti una modifica alla tua app Sinatra devi riavviare il server.

Questo significa se il '/di' L'URL è richiesto (utilizzando il metodo GET HTTP), "Un po 'di me". mostrerà.

Ogni volta che apporti una modifica alla tua app Sinatra devi riavviare il server. Quindi, per evitare il fastidio di fermare e avviare costantemente il server durante lo sviluppo, utilizzeremo la gemma Shotgun che abbiamo installato in precedenza.

Ferma l'attuale server Sinatra con Ctrl-C. Ora possiamo correre shotgun basics.rb e Shotgun riavvierà automaticamente il server ogni volta che aggiorniamo la pagina. Questo è utile quando stiamo facendo un sacco di lavoro di sviluppo, ma con il riavvio dell'intera applicazione, può essere lento.

Mentre l'ascolto di Shotgun su una porta diversa, passiamo alla porta 9393 e andiamo a http: // localhost: 9393 / su nel tuo browser. Dovresti vedere la frase che abbiamo impostato.


Accesso ai parametri URL

Puoi anche accedere ai parametri dall'URL. Aggiungi il seguente al tuo basics.rb file:

 ottieni '/ ciao /: nome' fai param [: nome] fine

In questo esempio, abbiamo un percorso in cui qualsiasi cosa dopo '/Ciao/' sarà contenuto in a params array con la chiave :nome. Il params la matrice contiene tutte le variabili GET e POST. Se provieni da uno sfondo PHP, questo è simile al $ _REQUEST array globale.

Nel browser, vai a, per esempio, http: // localhost: 9393 / ciao / dan e dovresti vedere il nome visualizzato indietro ("dan").

Potresti incorporare il :nome in una stringa avvolgendolo $ ? . Prova a sostituire il params [: nome] coincide:

 "Ciao, # params [: name]."

Come ci si aspetterebbe, possiamo usare tutti i normali metodi di Ruby sulla variabile, come ad esempio .upcase, .inverso eccetera.

 "Ciao lì # params [: name] .upcase."

Puoi impostare il percorso per accettare più variabili di stringa di query in questo modo:

 get '/ hello /: nome /: city' do "Hey there # params [: name] da # params [: city]." fine

Oltre alle normali variabili in un URL, Sinatra consente di recuperare le stringhe di query con caratteri jolly, note come "splat", utilizzando un asterisco come questo:

 ottenere '/ more / *' do params [: splat] end

Tutto incluso nell'URL dopo /Di Più/ sarà accessibile attraverso il : splat chiave nel params schieramento.


Visualizza file e post

Ora facciamo qualcosa di un po 'più interessante. Creiamo un modulo per recuperare i dati dall'utente, quindi fare qualcosa con esso. Faremo anche uso di un "file di visualizzazione", che ci consente di dividere il markup per una vista in un file separato. Aggiungi il seguente percorso al tuo basics.rb file app:

 ottieni '/ form' fai erb: form end

Questo percorso caricherà il file form.erb File ERB (Embedded Ruby) da a visualizzazioni/ directory. I file ERB sono in genere normali file HTML che consentono di includere all'interno del codice Ruby tag, che verranno analizzati prima di essere inviati al browser, proprio come il modo in cui includi il codice PHP o ASP in una pagina web.

Quindi crea un visualizzazioni/ directory nella stessa cartella di basics.rb file. E dentro visualizzazioni/, crea il file chiamato form.erb con il seguente contenuto all'interno:

 ciao dal punto di vista

Puntare il browser su http: // localhost: 9393 / modulo e dovresti vedere il messaggio che abbiamo impostato nel file di visualizzazione.

Ora sappiamo che tutto funziona, cambia il contenuto di quel file in:

 

Aggiorna la pagina e dovresti vedere il modulo:

Ma, inserisci un messaggio nella casella di testo e fai clic sul pulsante di invio, e vedrai la pagina di errore di Sinatra che ci informa che non esiste un percorso per questo URL.

Forse ti starai chiedendo perché questo è, visto che il modulo si sta sottomettendo a /modulo, lo stesso URL su cui si trova il modulo, quindi non dovrebbe esserci un problema. Bene, la differenza è che stiamo recuperando questa pagina attraverso il metodo POST HTTP - e come puoi vedere nella pagina di errore che ci presenta Sinatra, Sinatra richiede un percorso diverso per ogni metodo HTTP.

Quindi aggiungi il seguente percorso all'app Sinatra:

 post "/ form" do "Hai detto" # params [: message] "" end

Questo percorso è per il metodo POST, non GET. Inoltre, tutte le variabili POST sono disponibili nello stesso params array come variabili GET, così possiamo recuperare il messaggio inviato con il modulo. Provalo!


Ora potresti lavorare completamente per MI5!

Quindi che succede adesso? Creiamo un modo per 'criptare' un messaggio che inviamo in modo che possa essere letto solo dal nostro destinatario previsto. Aggiungi il seguente percorso all'app Sinatra:

 ottieni '/ secret' fai erb: secret end

Probabilmente starai imparando da ora. Questo percorso caricherà il file di visualizzazione ERB su views / secret.erb. Crea quel file di visualizzazione con il seguente:

 

Encryptor dei messaggi MI5 Super Secret!

E crea il percorso per il metodo POST:

 post '/ secret' fai params [: secret] .reverse end

OK, quindi ora abbiamo un crittografia di messaggi che utilizza uno speciale metodo 'inverso' per rendere il messaggio apparentemente illeggibile, abbiamo bisogno di un modo per decifrare il messaggio:

 prendi '/ decrypt /: secret' fai params [: secret] .reverse end

Ecco qua! Un crittografo di messaggi super segreto e altamente sicuro, abbastanza buono per l'agenzia di intelligence di qualsiasi paese.

Disclaimer legale: Quando diciamo "altamente sicuro" e "crittografia", in realtà stiamo solo invertendo le lettere. scusate.


FourOhFour?

Un'ultima cosa che toccheremo è 404 pagine di errore. In questo momento se vai a un URL per il quale non esiste un percorso (es. / danisthebest), vedrai il messaggio di errore di fantasia di Sinatra. Su una vera app vorremmo mostrare il nostro errore. Per fare questo, usa semplicemente il non trovato percorso, in questo modo:

 not_found do status 404 'non trovato' fine

Qui stiamo usando Sinatra stato metodo per impostare il codice di stato HTTP della pagina su 404 (è possibile utilizzare questo stesso metodo per impostare qualsiasi codice di stato, ad esempio 201 quando viene creato qualcosa, o 403 quando l'accesso non è riuscito).

Si potrebbe ulteriormente refactoring il non trovato percorso usando Sinatra arresto metodo:

 not_found do halt 404, 'page not found' end

Conclusione

Quindi hai eseguito il tuo primo duetto con Sinatra! Speriamo che tu possa vedere quanto questo DSL faciliti la creazione di app web.

Nella traccia successiva, creeremo una semplice app "da fare" collegata a un database SQLite. Daremo un'occhiata anche agli elusivi METTERE e CANCELLA HTTP metodi di cui nessuno ha mai sentito parlare.

Nota: Puoi sfogliare i file di progetto finali per questo tutorial su GitHub.