Ruby on Rails Tutorial: I Modelli

Nella prima parte del tutorial sono stati creati il progetto base e i database da utilizzare per il progetto in Ruby on Rails. I database così come i progetti sono per adesso vuoti.

Seppur vuoto il progetto è già funzionante: dal prompt dei comandi che abbiamo lasciato aperto nella cartella principale del progetto, digitiamo ruby script/server e premiamo invio.

$ ruby script/server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2007-08-10 19:12:43] INFO WEBrick 1.3.1
[2007-08-10 19:12:43] INFO ruby 1.8.4 (2005-12-24) [i686-darwin8.6.2]
[2007-08-10 19:12:43] INFO WEBrick::HTTPServer#start: pid=376 port=3000

Puntando il proprio browser verso http://localhost:3000 dovrebbe apparire il messaggio di benvenuto che ci informa che lo startup è andato a buon fine.

Messaggio di benvenuto di Ruby on Rails

A cosa servono i modelli in Ruby on Rails

Ruby on Rails segue il paradigma MVC; in breve, considera l’applicazione divisa in tre parti distinte:

  • i Modelli si occupano dei dati, di recuperarli, modificarli e combinarli insieme
  • le Viste sono le uniche parti dell’applicazione esposte all’utente finale per l’interazione e per mostrare informazioni
  • i Controller si occupano di interpretare le interazioni che l’utente ha per mezzo delle viste, di controllare i modelli e di preparare i dati per la visualizzazione dei risultati

Creare il primo modello

Alla nostra applicazione serve un modello per poter salvare e recuperare i link suggeriti dagli utenti del sito e per registrare i voti. Il nostro modello si chiamerà LinkUrl; dal prompt dei comandi digitiamo Control+C per fermare l’esecuzione di Webrick e digitiamo:

$ ruby script/generate model LinkUrl
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/link_url.rb
create test/unit/link_url_test.rb
create test/fixtures/link_urls.yml
create db/migrate
create db/migrate/001_create_link_urls.rb

Così come era successo alla creazione del progetto, questo comando crea automaticamente una serie di file in diverse cartelle per assisterci alla creazione del modello.

Tabella corrispondente al modello Ruby on Rails

Il primo file cha andiamo a modificare è db/migrate/001_create_link_urls.rb; in questo file andiamo a definire la struttura della tabella che conterrà le informazioni del modello LinkUrl. Accedendo al file notiamo la presenza di due metodi vuoti: self.up e self.down.



class CreateLinkUrls < ActiveRecord::Migration

  def self.up

    create_table :link_urls do |t|

    end

  end  def self.down

    drop_table :link_urls

  end

end

All’interno del metodo self.up aggiungiamo le istruzioni per la creazione della tabella.



class CreateLinkUrls < ActiveRecord::Migration

  def self.up

    create_table :link_urls do |t|

      t.column :created_at, :datetime

      t.column :url, :string, :null => false

      t.column :title, :string, :null => false

      t.column :description, :string, :null => false

      t.column :votes, :integer, :null => false, :default => 0

    end

  end  def self.down

    drop_table :link_urls

  end

end

L’istruzione t.column :created_at, :datetime richiede la creazione di una colonna in cui saranno inserite automaticamente la data e l’ora di creazione dell’entry; created_at è infatti un “magic field name”, per cui il relativo campo viene compilato automaticamente da ruby on rails in fase di salvataggio della riga sul database.

Le seguenti tre righe richiedono la creazione di attributi di testo di 255 caratteri al massimo (per intenderci si tratta dei VARCHAR SQL); :null => false indica che l’attributo non potrà essere nullo.

L’ultima riga richiede infine la creazione di un attributo di tipo intero, anche questo non potrà essere nullo, e con valore di default ‘zero’.

Ora dal prompt dei comandi digitiamo rake db:migrate per riversare quanto abbiamo scritto sul database.



$ rake db:migrate

(in /Users/luca/Documents/dev/voteup)

== CreateLinkUrls: migrating ================

-- create_table(:link_urls)

   -> 0.7600s

== CreateLinkUrls: migrated (0.7602s) ==========

Ora il nostro database possiede la tabella link_urls creata seguando le istruzioni che abbiamo inserito:



$ mysql -uroot

Welcome to the MySQL monitor.  Commands end with ; or g.

Your MySQL connection id is 3 to server version: 5.0.22-standard

Type 'help;' or 'h' for help. Type 'c' to clear the buffer.

mysql> USE voteup_development;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> SHOW TABLES;

+------------------------------+

| Tables_in_voteup_development |

+------------------------------+

| link_urls                    |

| schema_info                  |

+------------------------------+

2 rows in set (0.00 sec)

Insieme alla tabella link_urls è stata creata una seconda tabella, schema_info.



mysql> SELECT * FROM schema_info;

+---------+

| version |

+---------+

|       1 |

+---------+

1 row in set (0.00 sec)

La tabella schema_info contiene la versione del database secondo la convenzione del migrate; la versione attuale è la 1, dal momento che per la costruzione del database è stato applicato un solo file di migrate, db/migrate/001_create_link_urls.rb.

L’istruzione rake:db migrate permette di cambiare la versione del database in uso; ad esempio se digitiamo rake db:migrate VERSION=0 il database sarà ripristinato alla versione iniziale, e sarà quindi cancellata la tabella creata.

Per ogni file di migrazione è importante definire sia il metodo self.up che il metodo self.down; il metodo self.up viene utilizzato per raggiungere la versione del database descritta dal file, mentre il metodo self.down indica come ritornare alla versione precedente.