Creare un Model

Finora abbiamo visto i Controller e le View dell'architettura MVC:
Se un'applicazione deve salvare dei dati in un database abbiamo bisogno anche del Model.

Il Model è un oggetto ruby che rappresenta un certo tipo di dati memorizzati nel database... potremmo ad esempio avere un model per le schede dei clienti, uno per i prodotti, uno per gli acquisti...
In questo modo potremo lavorare con i dati memorizzati nel database scrivendo in linguaggio Ruby, e non direttamente in SQL. Il vantaggio è che se un giorno vorremo cambiare tipo di database (salvando ad esempio i dati nel cloud AWS di Amazon) non avremo bisogno di modificare la nostra applicazione.

Cosa vogliamo fare

Per capire come funziona il Model, creiamone uno molto semplice: lo chiameremo Like e dovrà memorizzare il numero di "mi piace" che sono stati fatti in una certa pagina.
Avremo bisogno quindi di due dati:
  • il nome della pagina: una stringa di testo
  • il numero di click: un numero intero, inizialmente uguale a zero

Creazione del model

Per creare il model Like scriviamo questa riga nella console:

Rails genera per noi alcuni file... andiamo a modificare quello della migrazione, aggiungendo un valore iniziale (di default) per il numero di click:

Le migrazioni

Le migrazioni sono modifiche alla struttura del database: il loro nome contiene la data e l'ora in cui sono state create. Esse vengono poi applicate in ordine ai vari server contenenti i database... in questo modo se un'applicazione è distribuita sarà sempre possibile fare in modo ordinato gli aggiornamenti.

Per applicare la migrazione scriviamo:
A questo punto il database è stato aggiornato.

Rollback

È anche possibile fare delle operazioni di rollback, e cioè di annullamento di una certa migrazione, con il comando:

rails db:rollback

La console di Rails

Usando il comando:
rails c

è possibile entrare nella console di Rails:

Da qui possiamo creare un primo record per il nostro modello Like, andando a preparare lo spazio dove memorizzare i click della home page:

Come vedi il model converte il tuo comando molto semplice in una query SQL più complessa, che va a inserire il dato nel database.

Per uscire della console usa il comando:

quit

Leggere i dati dal Model

Andiamo a modificare l'azione index del controller Home:

La riga inserita:
  • prende il modello Like
  • lo usa per trovare (find) il record relativo alla pagina 'home'
  • estrae dal record il numero di click
  • memorizza questo valore nella variabile @like

Variabili d'istanza

In Ruby le variabili precedute da una @ sono dette variabili d'istanza, e Rails le usa per rendere disponibili alle viste le variabili definite nel controller.

Visualizzare il dato nella vista

Inseriamo un bottone con il numero di like nella vista index:
Nota come il numero di like viene scritto da un frammento di codice Ruby che legge la variabile @like definita nel controller.

Modificare il dato

Iniziamo ora a contare i click. Per prima cosa aggiungiamo un'azione click al controller Home:

Nota: mettere questa nuova azione nel controller Home non sarebbe la scelta migliore se volessimo contare i like di tutta l'applicazione, ma per ora non complichiamo le cose.

Come nell'azione index, l'azione click per prima cosa legge il Like relativo alla pagina home...
...incrementa il numero di click...
...salva l'oggetto Like nel database...
...e infine fa un redirect alla rotta home (in questo modo non avremo bisogno di definire una vista per questa azione, perché dopo aver fatto il suo lavoro redirigerà il browser dell'utente alla home page.

Definiamo una rotta per questa azione:

Potremo quindi usare il nome della rotta click per far funzionare il nostro link:

Adesso potrai cliccare il tuo bottone andando ad incrementare il numero di like a ogni click: