Ruby On Rails Insert

  • Published on
    24-Jun-2015

  • View
    1.428

  • Download
    1

Embed Size (px)

DESCRIPTION

Come inserire i dati in una tabella che ha chiavi straniere

Transcript

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