Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Ruby On Rails
Matteo Canato
Matricola 065788
01/07/2010
2 Ruby On Rails
Sommario
1. Introduzione .................................................................................................................................... 3
2. Caratteristiche................................................................................................................................. 5
2.1. Il paradigma MVC .................................................................................................................... 5
2.1.1. Controller ........................................................................................................................ 5
2.1.2. View................................................................................................................................. 6
2.1.3. Model .............................................................................................................................. 6
2.2. Routing delle richieste ............................................................................................................ 6
2.2.1. ReST................................................................................................................................. 7
2.3. Rappresentazioni dei dati in RoR ............................................................................................ 8
3. Tools ................................................................................................................................................ 9
3.1. Programmare in Rails .............................................................................................................. 9
3.2. Testing e Debugging in Rails................................................................................................... 9
4. Documentazione ............................................................................................................................. 9
5. Progetto realizzato ........................................................................................................................ 10
5.1. Definizione dei requisiti di progetto ..................................................................................... 10
5.1.1. Definizione degli applicativi che dovranno essere realizzati ........................................ 10
5.1.2. Definizione dei requisiti funzionali................................................................................ 11
5.1.3. Definizione dei requisiti non funzionali ........................................................................ 11
5.2. Definizione dei vincoli progettuali e architetturali del sistema ............................................ 12
5.3. Progettazione del sistema di teleoperazioni ........................................................................ 12
5.4. Realizzazione del progetto .................................................................................................... 13
5.5. Realizzazione pratica ............................................................................................................. 15
6. Licensing e costi ............................................................................................................................ 16
7. Posizione di mercato e hype ......................................................................................................... 17
8. Prospettive future ......................................................................................................................... 18
9. Diffusione ...................................................................................................................................... 18
10. Conclusioni ................................................................................................................................ 19
Introduzione 3
1. Introduzione
Ruby on Rails, o più semplicemente Rails, è un framework server-side che rende più facile lo
sviluppo, l’implementazione e la gestione di applicazioni web database-backed.
Nei mesi che seguirono la sua versione iniziale nel luglio del 2004, Rails è passato da essere un
giocattolo sconosciuto ad essere un fenomeno mondiale e, più importante, è diventato il frame work
scelto per l’implementazione di una vasta gamma di cosiddette applicazioni Web 2.0. Molte società
multinazionali hanno già scelto Rails per le loro applicazioni web, ad esempio:
Twitter
YellowPages
Hulu
Justin TV
Scribd.com
GitHub
Ma da cosa è dovuto il successo di Ruby On Rails? In primo luogo, un gran numero di sviluppatori
erano “frustrati” con le tecnologie che stavano usando per creare applicazioni web.
Indipendentemente dal linguaggio utilizzato, sia esso Java, PHP oppure . NET, c'è stato un crescente
senso che il loro lavoro fosse troppo duro. Con l’arrivo di Rails programmare applicazioni web è
diventato più “facile” in quanto esso coniugava l'agilità del mondo LAMP con la rigorosa
organizzazione del mondo J2EE.
Questa facilità è dovuta, ad esempio, dal fatto che tutte le applicazioni Rails sono implementati
utilizzando il paradigma architetturale Model-View-Controller (MVC) disaccoppiando l'accesso ai dati
e la business logic dalla presentazione dei dati e dall'interazione con l'utente.
Gli sviluppatori Java per poter realizzare un’architettura MVC devono basarsi, previa configurazione
degli stessi, su framework come Arazzi e Struts. Ruby On Rails nasce nativamente con questo
paradigma e và oltre fornendo una serie di funzionalità come un sistema di testing integrato e
automatico all’inserimento di una nuova funzionalità nel codice.
Le applicazioni Rails sono scritte in Ruby, un moderno linguaggio di scripting orientato agli oggetti.
Ruby è conciso, senza essere incomprensibile in modo da poter esprimere pensieri in codice Ruby in
modo naturale e chiaro. Questo porta a sorgenti brevi ma che siano di facile scrittura e (altrettanto
importante) di facile lettura anche mesi e mesi dopo.
Rails porta questa particolarità di Ruby al limite, estendendolo in nuovi modi e con nuovi concetti
che rendono effettivamente più facile la vita ai programmatori. A differenza di altri framework è
possibile anche eseguire operazioni che normalmente vanno fatte in file di configurazione esterni
(come le relazioni tra i campi di una tabella) anziché all'interno del codebase invece. Questo rende
molto più facile vedere cosa sta succedendo. In sostanza Rails consente uno sviluppo estremamente
agile ed incrementale delle applicazioni.
4 Ruby On Rails
A titolo di esempio, si osservi quante informazioni vengono espresse in poche righe di codice per la
definizione della classe del modello per un progetto.
class Project < ActiveRecord::Base
belongs_to :portfolio
has_one :project_manager
has_many :milestones
has_many :deliverables, :through => :milestones
DRY
Convention Over Configuration
DRY sta per “Dont-Repeat-Yourself” ovvero “non ripetere se stessi”. Questo principio prevede che
ogni pezzo di conoscenza in un sistema dovrebbe essere espresso in un solo luogo.
Rails usa tutta la Potenza di Ruby per realizzare questo. La duplicazione di codice in un’applicazione
Rails è pressoché assente: si definisce di cosa si ha bisogno in un certo punto (rispettando la
convenzione del paradigma MVC) e si prosegue nella programmazione. Inoltre eventuali modifiche
allo schema dell’applicazione non comportano necessariamente la modifica di molte altre pagine,
come accade con altri web frameworks.
Il principio di “Convention Over Configuration” è un altro concetto essenziale e indica che Rails offre
soluzioni predefinite per quasi tutti gli aspetti che compongono un’applicazione. Attenendosi alle
convenzioni è possibile realizzare un’applicazione Rails con meno codice di quello che occorre per la
configurazione XML di una tipica applicazione web in Java.
Ruby on Rails non vuole imporre un nuovo standard per le tecnologie web ma, al contrario, cerca di
favorirne la definizione e il corretto utilizzo. Rails infine facilita agli sviluppatori l’integrazione di
funzioni quali Ajax e interfacce RESTful nel proprio codice in quanto il supporto a queste è nativo dal
framework stesso.
Caratteristiche 5
2. Caratteristiche
La figura seguente illustra il funzionamento del paradigma MVC, nel quale si possono distinguere 4
fasi:
2.1.1. Controller
Il controller in Rails è un oggetto ActionController ed è il cuore pulsante di RoR. ActionController è
quel componente che processa e risponde ad eventi (tipicamente interazioni con utente) e può
effettuare cambiamenti sul modello.
In ogni controller si definisce un insieme di azioni che possono essere chiamate dall'utente. Più nel
dettaglio, i controller sono classi Ruby derivate da ActionController::Base che implementano un
metodo pubblico per ogni azione supportata.
http://myhost/pippo/paperino
invoca il metodo paperino del controller PippoController.
Infine per ogni azione si deve definire una View apposita per la rappresentazione dei risultati.
6 Ruby On Rails
2.1.2. View
Le View si basano su ActionView e rappresentano il templating system di RoR. Esse presentano il
modello in una forma adatta per l'interazione con l'utente come (X)HTML.
Per la generazione dinamica di pagine HTML si utilizza ERb, abbandonando RHMTL a partire da Ruby
On Rails 2.0. Ogni View ha accesso alle variabili di istanza del Controller ad essa associato. Inoltre
ActionView prevede alcune funzionalità avanzate quali:
2.1.3. Model
Il Model è la rappresentazione domain-specific delle informazioni su cui l'applicazione opera. I model
si basano su ActiveRecord, un ORM estremamente potente e facilissimo da usare che permette,
attraverso un'interfaccia orientata agli oggetti, tutti i servizi inerenti la persistenza dei dati,
astraendo nel contempo le caratteristiche implementative dello specifico RDBMS utilizzato.
In particolare ActiveRecord fornisce alcune funzionalità non presenti in altri ORM per altri framework
di sviluppo (come J2EE):
È tuttavia possibile cambiare la configurazione del routing di Rails in modo molto flessibile.
Sempre a proposito di routes, Ruby On Rails inoltre è attualmente la migliore piattaforma per lo
sviluppo di applicazioni ReST.
Caratteristiche 7
2.2.1. ReST
ReST (Representational State Transfer) è uno stile architetturale per la realizzazione di applicazioni
Web. ReST viene originariamente formalizzato da Roy Fielding (uno dei principali architetti di HTTP)
nella sua tesi di dottorato, dopo un'accurata analisi delle caratteristiche che hanno portato al
successo del Web
Il principio alla base di ReST è che lo stato e la funzionalità delle applicazioni vengano suddivisi in
risorse e ogni risorsa è univocamente indirizzabile utilizzando una sintassi universale per l'utilizzo in
link ipermediali.
Per poter manipolare le risorse, client e server comunicano attraverso un'interfaccia standardizzata,
scambiandosi delle “rappresentazioni” delle risorse. Questa interfaccia, in particolare, è costituita
da:
L'interfaccia per manipolare le risorse in REST è semplicemente il protocollo HTTP: come SQL usa
INSERT, SELECT, UPDATE, and DELETE per manipolare dati relazionali, ReST usa i metodi PUT, POST,
GET, e DELETE di HTTP per manipolare le risorse.
Nell’immagine seguente è possibile vedere un esempio di mapping tra URL e risorse in un blog:
Rails è, per sua natura, la migliore piattaforma attualmente esistente per la realizzazione di
applicazioni ReST. L'adozione di ReST semplifica moltissimo il design delle applicazioni in Rails, in
quanto si ha:
2.2.1.2. Vantaggi
I vantaggi derivati dall’utilizzo di un’interfaccia ReST per la nostra applicazione sono quindi:
La rappresentazione da fornire al client viene scelta a seconda del suffisso della URL (es: .xml, .js) o
dello header HTTP Accept (es: “text/javascript”) forniti dal browser.
La discriminazione viene effettuata dal metodo respond_to all’interno della action del controller
indicato dall’URL. Ad esempio è possibile far ritornare:
respond_to do |format|
format.html
format.js { @model.to_json }
format.xml { @model.to_xml }
end
Tools 9
3. Tools
3.1. Programmare in Rails
E’ possibile programmare praticamente con ogni editor di testo a seconda del sistema operativo in
uso. Tuttavia si consiglia sempre l’utilizzo di editor di testo che permettano di effettuare almeno il
syntax highlighting come vim o TextMate.
Per quanto riguarda gli IDE la versione 6.x di NetBeans offre un ottimo supporto nativo a Rails, con
tanto di funzionalità quali l’autocompletamento dei metodi. Anche Eclipse offre un supporto
decente alla programmazione Rails/Ruby, ma occorre installare i plugin:
Rails prevede diversi meccanismi integrati (alcuni un po’ sui generis, altri molto evoluti) per il testing.
Tra questi occorre citare le suite:
4. Documentazione
La documentazione su Rails era, fino a qualche anno fa, tipicamente di pessima qualità. Per fortuna
le cose ora stanno cambiando in fretta, grazie anche alla sempre maggiore diffusione di sviluppatori
Ruby/RoR e al supporto della comunità.
Sam Ruby, Dave Thomas, David Heinemen Hansson “Agile Web Development with Rails”,
Fourth Edition, Pragmatic Bookshelf, June 2010 (considerata “la Bibbia” di RoR, per Rails 3.0)
Sam Ruby, Dave Thomas, David Heinemen Hansson “Agile Web Development with Rails”,
Third Edition, Pragmatic Bookshelf, December 2008 (per Rails 2.2.2)
Mike Clark, “Advanced Rails Recipes: 84 New Ways to Build Stunning Rails Apps”,
Pragmatic Bookshelf, May 2008 (per Rails 2.2.0)
Obie Fernandez, “The Rails Way”, Addison-Wesley, November 2007 (per Rails 2.0)
10 Ruby On Rails
Le edizioni in italiano, che (quando esistono) sono obsolete anche di alcuni anni e per tale motivo
sono caldamente sconsigliate.
5. Progetto realizzato
Il prototipo realizzato è un progetto reale attualmente in produzione presso un’importante azienda
leader nel settore per la produzione di macchine automatiche. Di seguito viene data una descrizione
generica del progetto evitando di divulgare informazioni protette da segreto.
visualizzazione sinottica dello stato della macchina in tempo reale alcuni parametri della
macchina tra i quali:
o visualizzazione degli stati della macchina registrati nelle ultime 24 ore;
o visualizzazione e modifica dei parametri di funzionamento della macchina e
eventuale ripristino dei valori di default da remoto;
o analisi allarmi, diagnosi dei guasti e visualizzazione dei guasti su immagine della
macchina;
o creazione di watchdog che controlli eventuali mancate connessioni giornaliere da
parte delle macchine;
o gestione e invio SMS. Invio di un SMS ad un numero di cellulare predefinito
(manutentore di zona) a ogni allarme verificatosi sulle macchine;
autenticazione utenti. L'accesso al sistema dovrà essere controllato tramite una fase di
autenticazione preliminare, che identifica l'utente che accede al sistema e, attraverso una
tabella contenuta nel database, determina il livello e i permessi dell'utente e
conseguentemente il grado di dettaglio nella visualizzazione dei dati a cui ha accesso. Il
sistema deve prevedere diversi livelli di accesso (ad esempio, amministratore, cliente,
operatore tecnico);
localizzazione delle macchine tramite Google Maps. Si prevede, in futuro, di visualizzare le
macchine a cui si ha accesso attraverso dei mash-up su Google Maps. Per creare il link si
potrebbe utilizzare una tabella statica contenente le coordinate geografiche del luogo di
installazione della macchina;
sicurezza. Il sistema deve garantire il massimo livello di sicurezza. Quindi i server sono di
proprietà (niente housing e hosting) e quindi sono configurati e continuamente mantenuti
per evitare possibili attacchi e per prevenire la perdita di dati e informazioni. E’ presente
anche un sistema automatico di backup. Inoltre la comunicazione con il server deve avvenire
attraverso protocolli di comunicazione protetti e su porte standard, sia tra macchine e server
che tra utente e server;
disponibilità. Il sistema deve essere sempre disponibile e fronteggiare situazioni di guasti
senza presentare perdite di servizio;
scalabilità. Il sistema deve essere scalabile ed essere in grado di sopperire alle esigenze di
crescita della rete di macchine controllate;
12 Ruby On Rails
Il motivo che sta alla base delle scelte è lo sviluppo basato su tecnologie innovative Open Source che
proteggano nel futuro gli investimenti eseguiti e non richiedano di legarsi a fornitori di software
proprietari. Le tecnologie scelte sono già mature (e molto ben supportate) per un impiego di tipo
industriale.
L'infrastruttura del sistema è composta da due elementi principali: una base dati contenente le
informazioni relative alle macchine e agli utenti e un'interfaccia Web che consenta l'accesso a tali
dati.
La base dati è gestita con MySQL mentre l'interfaccia web sarà fornita da un'applicazione sviluppata
con il framework Ruby on Rails. Rails è abbastanza matura come tecnologia in quanto è utilizzata per
la realizzazione di applicazioni per tutte le categorie: finanza, e-commerce, arte, media,
comunicazione, ecc.
Per quello che riguarda l'architettura del sistema lato server, è rappresentata nella figura di seguito.
Tale architettura prevede l'utilizzo del server Web Apache per il provisioning di contenuti statici e
per il reindirizzamento, in modalità Load Balancing Reverse Proxy, delle richieste di contenuti
dinamici a più istanze di Ruby on Rails tramite interfaccia HTTP con la libreria Mongrel.
Di seguito vengono elencate tutte le scelte progettuali adottate, per ogni componente
dell'applicazione, specificandone i dettagli tecnici.
Modalità di autorizzazione per l'accesso ai dati e le operazioni degli utenti: in base ai requisiti
progettuali, la scelta sulla modalità di autorizzazione è caduta sul metodo RBAC (Role-Based
Access Control), e in particolare sul plugin per Rails ACL System2. RBAC consente di
controllare le autorizzazioni mediante la definizione di ruoli che possono effettuare
operazioni specifiche e l'assegnazione di tali ruoli (uno o più) agli utenti del sistema. I ruoli
che sono stati identificati sono i seguenti: ADMIN (può eseguire qualsiasi operazione),
END_USER (lettura dei dati commerciali), TECHNICIAN (lettura dei dati tecnici) e
AFTER_SALES (lettura dati tecnici, connessione macchine).
Database e interfacce differenziate: ogni macro-area del sistema ha un proprio database e
una propria interfaccia utente. Tale suddivisione è stata pensata in modo da garantire la
sicurezza dei dati memorizzati e prevenire eventuali visualizzazioni accidentali di dati
sensibili da parte della concorrenza (numero di macchine installate, prodotto venduto, ecc.).
La struttura dei database sarà comune a tutti.
Questa modalità di implementazione comporta una divisione per gli utilizzatori che si
devono occupare di più di una macro-area. Ad esempio, un tecnico che si occupa di
macchine di clienti diversi (e concorrenti), non potrà vedere contemporaneamente tutte le
macchine ma dovrà effettuare un login differente a seconda di ciò che vuole visualizzare.
Tipologia delle tabelle dei database: dal momento che le transazioni non sono necessarie in
questo sistema, le tabelle che comporranno i database sono di tipo myIsam che, tra le altre
cose, sono quelle che vengono create di default da Ruby on Rails.
Progetto realizzato 15
6. Licensing e costi
Tutte le tecnologie utilizzate in questo progetto sono Open Source e quindi il costo di licensing è pari
a zero. Inoltre l’aver scelto tecnologie innovative Open Source che proteggano nel futuro gli
investimenti eseguiti e non richiedono quindi di legarsi a vendor di software proprietari. Le
tecnologie scelte sono già mature (e molto ben supportate) per un impiego industriale. I costi
dunque sono legati alla formazione del personale tecnico per l’utilizzo delle applicazioni e per la,
eventuale, formazione degli sviluppatori alla programmazione in Ruby On Rails.
Posizione di mercato e hype 17
Questo è dovuto al fatto che Rispetto a Java/J2EE/PHP, Rails è una tecnologia abbastanza giovane
quando si tratta di ottenere l'accettazione del mercato sebbene RoR sia tecnologicamente avanzata
pur avendo una curva di apprendimento molto rapida.
18 Ruby On Rails
8. Prospettive future
Il framework Ruby On Rails è stato rilasciato al pubblico nel luglio 2004 e ha iniziato subito ad avere i
primi contributi concreti dalla comunità per il proprio sviluppo. La prima release stabile 1.0 è stata
rilasciata nel dicembre 2005. Due anni più tardi vide la luce Rails 2.x che portava grandi novità quali:
output HTML e XML di default, migliore integrazione per la creazione di servizi web ReST, gestione
time zones, integrazione del framework con le gem dependencies per i plugin, i18n, HTTP valida
tors, miglioramento del caching e della sicurezza dei thread e soprattutto tanta documentazione.
E’ in fase di beta la versione 3.0 di Rails che permette di migliorare la robustezza e la scalabilità delle
applicazioni e di portare la programmazione web-oriented con Ruby su un nuovo livello di standard.
9. Diffusione
Molte società multinazionali hanno già scelto Ruby On Rails per le loro applicazioni web, ad esempio:
Twitter
YellowPages
Hulu
Justin TV
Scribd.com
GitHub
E molte alter disponibili all’indirizzo rubyonrails.org/applications
Conclusioni 19
10. Conclusioni
Ruby on Rails risulta essere quindi un framework molto versatile e potente. Nelle sue ultime
implementazioni cerca di favorirne la definizione e il corretto utilizzo delle moderne tecnologie web.
Rails infine facilita agli sviluppatori l’integrazione di funzioni quali Ajax e interfacce RESTful nel
proprio codice in quanto il supporto a queste è nativo dal framework stesso. Inoltre la curva di
apprendimento, da parte degli sviluppatori è molto rapida: ciò permette di realizzare anche
complesse applicazioni web in un tempo relativamente ridotto.
Sebbene molte delle più grandi società multinazionali hanno effettuato numerosi investimenti e i
relativi servizi sono interamente basati su RoR (come Twitter), il mercato è ancora scettico su questa
tecnologia ritenendola ancora troppo giovane e immatura anche se Gartner Group lo indica come
tecnologia di riferimento della nuova generazione di applicazioni web.