Ruby On Rails Insert

Preview:

DESCRIPTION

Come inserire i dati in una tabella che ha chiavi straniere

Citation preview

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