Ruby on Rails, insert su di un tabella voti
Lezione del Prof. Silvano Natalizi, marzo 2009
Testo del problema Si vuole fare il programma che permette di
inserire i voti nella tabella voti. tracciato record della tabella: Id (integer,chiave primaria) datavoto (datetime) studente_id (foreign key) materia_id (foreign key) prof_id (foreign key) tipovoto (string) voto (decimal) desc (text)
Creazione della applicazione voti rails voti cd voti
Creazione scaffold delle tabelle senza chiavi straniere ruby script/generate scaffold studente
nome:string ruby script/generate scaffold insegnante
nome:string ruby script/generate scaffold materia
string:nome rake db:migrate Con il comando rake ha creato le tre tabelle
con i nomi rispettivamente studentes, insegnantes, materias (il plurale in inglese)
Inserimento di alcuni dati di prova nelle tabelle create Lanciare il web server con il comando ruby
script/server
Navigare su localhost:3000/materias Inserire alcuni dati nella tabella materia
Navigare su localhost:3000/studentes Inserire alcuni dati nella tabella studente
Navigare su localhost:3000/insegnantes Inserire alcuni dati nella tabella insegnante
Tutto questo lo si fa con le view che sono state automaticamente generate dallo scaffold
Ora bisogna creare la tabella con le chiavi straniere Conviene fare il lavoro a mano Anzitutto creiamo il modello con il comando ruby script/generate model
voto datavoto:datetime studente_id:integer materia_id:integer prof_id:integer tipovoto:string voto:decimal desc:text quindi eseguire il comando: rake
db:migrate
La tabella votos La tabella votos è starta creata con i campi
desiderati, ma ancora è vuota Possiamo esaminare le tabelle create, perché
il database si chiama development.sqlite3 ed è interno alla cartella db
Lo possiamo aprire con il comando: sqlite3 development.sqlite3 Poi possiamo vedere quali tabelle sono
presenti con .tables Infine possiamo vedere la sua struttura record
con il comando .schema votos
Ora creiamo il controllore per gestire l’inserimento dei dati in votos Se guardiamo nella cartella app/controllers
vediamo la presenza dei controllori insegnantes_controller.rb, materias_controller.rb, studentes_controller.rb, che sono stati creati dallo scaffold in maniera automatica
Chiaramente non è presente votos_controller Ora creiamo votos_controller con il comando: ruby script/generate controller votos
Apriamo votos_controller.rb con un editor
Scriviamo il codice che ci serve dentro la classe VotosController Inseriamo anzitutto un metodo per leggere
tutti gli studenti, tutte gli insegnanti, tutte le materie dalle rispettive tabelle del database
@materie=Insegnante.find(:all) @studenti=Studente.find(:all) @insegnanti=Insegnante.find(:all)
Osserva che le parole con la iniziale maiuscola sono i nomi delle classi dei modelli
Ogni modello corrisponde ad una tabella relazionale
il metodo inserisciVoti
Creazione della view inseriscivoti.html.erb
Prova questo metodo inseriscivoti Riavvia il web server con ruby script/server Quindi naviga su
localhost:3000/votos/inseriscivoti Vediamo tre menù a tendina
Mettiamo tutti i dati del voto in una form I menù a tendina della materia,
dell’insegnante, dello studente ci servono per gestire le chiavi straniere
Per tutti gli altri dati che non sono chiavi straniere, inseriamo delle caselle di testo
In fondo mettiamo un bottone di invio dati
Come è fatta la form inseriscivoti
Come è fatto il metodo create
La visualizzazione della form
Che cosa otteniamo con dei dati di prova Come si vede, ci sono 2 errori: il campo del tipo
voto è vuoto, inoltre il voto è zero! Perché ?
Il seguito alla prossima puntata Bisogna cercare l’errore. Per quanto riguarda
il voto c’era da aspettarsi che qualcosa andasse male, perché il campo è di tipo testo, ed invece il voto è float. Pertanto bisogna trovare l’istruzione che permette di convertire una string in un decimale!
Per quanto riguarda il tipovoto, l’errore è strano, bisogna studiarci un pò,.
A domani
Ho avuto un ripensamento Ho corretto il primo errore dovuto al fatto che
mancava l’istruzione che settava il valore di “tipovoto”. Ok
Per quanto riguarda il voto, la mia previsione era giusta, occorreva convertirlo in float con @voto.to_f
Ma non bastava. Occorreva modificare il nome di @voto in @voto1, altrimenti gli dava fastidio il fatto di avere lo stesso nome dell’oggetto @voto
Infine tutto ok! Come si può vedere dalla schermata successiva.
Prova finale