Sinatra has taken the stage!

Non si tratta del compianto Frank, ma di uno degli ultimi framework per lo sviluppo web arrivati in casa Ruby. La caratteristica principale di Sinatra è la sua semplicità, ancora più spinta rispetto a quella a volte anche un po' troppo magica di Camping: con sole 5 righe è possibile ottenere una risposta dal server. Non ci credete? Allora, dopo averlo installato usando rubygems (gem install sinatra -y), provate il seguente codice...

# main.rb require 'rubygems' require 'sinatra' get '/' do 'Cool, Sinatra is performing on the main stage!' end

Usando il comando ruby main.rb si ottiene un'istanza di Mongrel con la nostra applicazione pronta a ricevere le chiamate dal browser, mentre nella finestra del terminale si viene avvisati che Sinatra has taken the stage on port 4567! Non resta da far altro che verificare l'effettivo funzionamento con un semplice wget -qO- http://localhost:4567/ (oppure curl http://localhost:4567/ se preferite):

Cool, Sinatra is performing on the main stage!

Sinatra può essere definito un micro-framework traverstito da DSL dotato di una grammatica ridotta, semplice e immediata. Sinatra non obbliga lo sviluppatore a strutturare la propria applicazione seguendo l'architettura MVC (ma è comunque possibile replicarla), non è legato a un particolare motore di template (ma supporta molto bene ERB e l'ottimo HAML), non offre la miriade di helpers inclusi nel prezzo come altri framework e inoltre è assolutamente ORM-agnostico: tutto ciò può avere i suoi pro e contro, ma queste caratteristiche lo rendono indubbiamente un ottimo framework per lo sviluppo di prototipi o di applicazioni semplici ma relativamente veloci. Sinatra, per come è strutturato, promuove inoltre lo sviluppo di interfacce REST per le proprie applicazioni web, rendendolo quindi uno strumento agevole per prototipizzare API.

get '/' do # mostra risorsa end post '/' do # crea risorsa end put '/' do # aggiorna risorsa end delete '/' do # cancella risorsa end

Viene naturale a questo punto chiedersi come vengano gestite le rotte, ma anche in questo caso è tutto molto semplice e intuitivo:

get '/hello' do redirect '/hello/anonymous' end get '/hello/anonymous' do 'Hello Mr. Anonymous, I would be glad to know your name!' end get '/hello/:name' do user = params[:name] "Hello, #{user}!" end # wget -qO- http://localhost:4567/hello # Hello Mr. Anonymous, I would be glad to know your name! # wget -qO- http://localhost:4567/hello/anonymous # Hello Mr. Anonymous, I would be glad to know your name! # wget -qO- http://localhost:4567/hello/NRK # Hello, NRK!

Occorre solamente far notare che Sinatra effettua il lookup delle rotte nell'ordine di definizione, per questo motivo la seconda rotta /hello/anonymous non viene catturata dalla terza che invece specifica un più generico /hello/:name. Concentrandosi appunto su quest'ultima, possiamo notare come più in generale le variabili all'interno di una rotta possano essere definite semplicemente sfruttando la stessa sintassi utilizzata per definire un simbolo in Ruby e come esse vengano automaticamente rese disponibili nell'hash params.

Se avessimo bisogno di un approccio più in stile MVC? Partendo dal presupposto che con Sinatra non serve creare una classe controller ma basta definire le singole azioni, a questo punto mancano solo le viste. Occorre quindi creare una directory views nel path della nostra applicazione, preparare il proprio template salvando il file relativo nella suddetta directory (per esempio greet.haml oppure greet.erb a seconda di quale motore di template vogliate usare) e scrivere una semplice riga di codice per la rotta:

get '/hello/:name' do haml :greet end

Per convenzione Sinatra effettua l'autocompletamento del nome del file della vista aggiungendo .haml o .erb, per cui basta specificarne il nome. Se avessi voluto utilizzare erb avrei scritto erb :greet ma dal momento che haml tutto sommato mi piace (gem install haml), ecco qui il codice d'esempio assolutamente minimale:

!!! %html %head %title Greetings! %body %span Hello, %strong= params[:name]

A questo punto la chiamata a http://localhost:4567/hello/NRK produrrà il seguente output:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>Greetings!</title> </head> <body> <span> Hello, <strong>NRK</strong> </span> </body> </html>

Tutto molto semplice, no?

Sinatra è in una fase di sviluppo abbastanza attiva ma è un framework già particolarmente interessante per tutte quelle necessità in cui Ruby on Rails oppure framework similari risulterebbero soluzioni spropositate. Essendo basato su Rack è possibile servire le applicazioni usando server differenti da Mongrel, come per esempio Thin o Phusion Passenger via Apache. Personalmente lo sto provando nei ritagli di tempo per creare una sorta di gateway da un servizio JSON-RPC che avevo realizzato qualche tempo fa a un servizio REST-oriented con tanto di interfaccia web per la gestione delle azioni e la visualizzazione dei dati, per ora sono molto soddisfatto della sua semplicità.


Puoi scrivere un commento oppure inviare un trackback dal tuo sito.

3 commenti a “Sinatra has taken the stage!”

  1. Gravatar
    ricochet ha detto:

    complimenti per il blog, molto professionale!

  2. @ricochet: grazie 🙂

  3. Bell'articolo, e fa vedere come si possono fare le cose in pura semplicità.
    Sicuramente giovane, ma da seguire

Lascia un commento

Puoi utilizzare i seguenti tag XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>