inserting
DESCRIPTION
Come inserire dei record nel database con railsTRANSCRIPT
Lezione su Ruby on Rails
Prof. Silvano Natalizi
Aprile 2009
La scrittura dei dati nella tabella è l’opposto della lettura dei dati
Invece di avere una view per mostrare i dati, ci occorre una form per sottomettere i dati.
Invece di avere un metodo del controllore che invii i dati ad una pagina web, ci occorre un metodo che legga i dati di una pagina e li trasformi in un oggetto
Invece di avere il modello che legga un record e lo converte in un oggetto, ci occorre che il modello converta un oggetto in un nuovo record del database
Che cosa occorre per la Lettura Che cosa occorre per la Scrittura
Un modello per leggere un record e convertirlo in un oggetto
Un modello per convertire un oggetto in un nuovo record del database
Un metodo show del controllore per inviare i dati alla view della pagina web
Un metodo create del controllore per leggere i dati di una form della pagina web e trasformarli in un oggetto
Una view per mostrare dati in output
Una form per digitare e sottomettere i dati in input
I campi della form combaciano con quelli dell’oggetto
Con l’eccezione della chiave primaria id Il nome del campo della form deve
coincidere con quello dell’attributo dell’oggetto
Ad un certo punto l’applicazione deve trasferire i dati tra la form e l’oggetto
Ai campi della form occorre dare dei nomi che esplicitamente corrispondano a quelli del modello
<% form for %> Questo tag viene usato per generare una
form L’istruzione è: <% form for(@ad,:url=>{:action=>’create’}) do |f| %>
@ad specifica per quale oggetto si vuole fare la form :action=>’create’ indica quale metodo del controllore dovrà
elaborare i dati della form
I campi della form sono generati con espressioni simili a questa:
<p><b>Nome</b>br /><%= f.text_field :price %></p>
:price indica il nome della variabile
Il bottone submit, per inviare al server i dati della form, viene generato con la seguente istruzione:
<%= f.submit “create” %>
La pagina “New ad” con la form per digitare i dati deve apparire con l’indirizzo url
http://mebay.com/ads/new Mentre la form è inviata all’elaborazione con http://mebay.com/ads/create Pertanto occorre che nel file routes.rb siano
inserite le relative route; perché una route dice a rails quale parte di codice deve usare per soddisfare la richiesta del browser
map.connect ‘/ads/new’, :controller=>’ads’, :action=>’new’
map.connect ‘/ads/create’, :controller=>’ads’, :action=>’create’
Nel controllor ‘ads’ devono pertanto essere scritti i metodi new e create.
Nel metodo ‘new’ bisogna mettere l’istruzione che crea un oggetto di tipo ads
@ad= Ad.new Se non viene scritta questa istruzione,
quando andiamo a testare l’url corrispondente, Rails dà il seguente errore.
Per default, una variabile ,ad esempio, @ad è settata con un valore speciale chiamato nil, che significa nessun valore.
una variabile nil non ha nessun attributo, come ad esempio @ad.name, @ad.description,…
Una variabile @ad nil causa problemi alla form for(@ad…)
La form è basata sull’oggetto @ad, perché essa accede a ciascun attributo dell’oggetto per generare i valori iniziali dei campi della form.
La combinazione di un metodo del controllore e di una view costituisce una azione!
Pertanto il nome di un’azione deve essere sia un metodo del controllore che il nome di una view.
La form usa il protocollo http per inviare i dati al server
Pertanto sulla rete non viaggia l’oggetto, ma viaggiano i dati della form
Come sono formattati i dati ?
I campi della form sono memorizzati nella struttura dati (hash o array associativo) params
In questa struttura dati sono memorizzati sia i valori che i nomi dei campi della form
Praticamente si ha ha una tabella che fa corrispondere a ciascun nome di campo il suo valore come digitato nella form.
Il metodo create deve salvare i campi della form nel database
Rails può solo usare oggetti per parlare al database.
Pertanto, prima di salvare i dati della form, rails deve convertirli in un oggetto
Il metodo new deve essere eseguito passando in input i dati della form, ossia di params, per inizializzare gli attributi del nuovo oggetto
@ad=Ad.new(params[:ad])
Dopo aver convertito i dati della form in un oggetto,
Occorre salvare questo oggetto nel database, con l’istruzione
@ad.save Rails ispeziona tutti gli attributi e genera gli
SQL statements di insert
def create
@ad=Ad.new(params[:ad])
@ad.save
end
Quando viene completata l’esecuzione del metodo create, un nuovo record è correttamente memorizzato nel database.
Poi rails deve generare una pagina di risposta e va a cercare una view con il medesimo nome create.html.erb.
Ma questo template non esiste!
Creiamo il file create.html.erb per confermare che il record è stato creato correttamente e per fornire il link al nuovo record
<h1>Ad creato!</h1> Esamina il record<a href=“/ads/<
%[email protected] %>”>qui</a>