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