[rails] validates_presence_of funzia ma senza errori

Salve! Sto costruendo la mia prima applicazione (di test) in Rails. Ho
una tabella (in sqlite3) con 2 colonne: name e description. Ho un form
(http://localhost:3000/formtest/admin) che richiama un’azione ‘addEntry’
(http://localhost:3000/formtest/addEntry), in un controller denominato
‘formtest’.

addEntry riceve i dati dal form e li salva, dopodiché esegue un redirect
ad una pagina che mostra tutte le righe (che ho chiamato entries) della
tabella (http://localhost:3000/test_db1/showAll).

Ora, tutto funziona correttamente. Però nel model (entry.rb) ho aggiunto
per prova un semplice validates_presence_of :name. Funziona, nel senso
che se io inserisco solo la description non salva nulla. Il problema è
che non mi genera alcun errore. Cioé, io mi aspetterei che invece di
fare il redirect, rimanesse in admin e mi segnasse il campo errato.

Qual’è la/le stupidaggine/i che sto commettendo? :slight_smile: Se avete 1 minuto vi
ringrazio.

Mi sono risposto da solo:

il form in admin (http://localhost:4000/formtest/admin) chiamava
l’azione addEntry (http://localhost:4000/formtest/addEntry):


def addEntry
@entry = Entry.new(params[:entry])
@entry.save
redirect_to(“/test_db1/showAll”)
end


validates_presence_of :name effettivamente bloccava la scrittura nel db,
ma non poteva certo bloccare il redirect a /test_db1/showAll. Dunque ho
riscritto la funzione così:


def addEntry
@entry = Entry.new(params[:entry])
if @entry.save then redirect_to(“/test_db1/showAll”) end
end


A questo punto però in caso di errore il controller cercava la pagina
addEntry.rhtml, che non esiste, e comunque non è ciò che mi serve. In
effetti devo forzare il rendering della pagina che voglio
effettivamente:


def addEntry
@entry = Entry.new(params[:entry])
if @entry.save
redirect_to(“/test_db1/showAll”)
else
render :action => ‘admin’
end
end


Ed ecco che tutto funzia a dovere.

Diciamo comunque che ho fatto un bel devasto: se tenevo admin, addEntry
e
showAll sotto un unico controller mi rendevo la vita molto più facile.
Sbagliando s’impara!!!

Luca R. wrote:

Mi sono risposto da solo:
[spiegazione]

Innanzitutto, grazie mille per aver descritto tutto quello che ti è
capitato e hai fatto, stavo proprio cercando di capire come gestire dei
campi obbligatori ed ero in alto mare :slight_smile:

Visto che ci sono, scrivo che stavo facendo, magari si può anche aprire
un dibattito :slight_smile:

Ho fatto una piccola applicazione in rails (ma va?), usando lo
scaffolding da controller (su cosa_controller.rb c’è il simpatico
comando: scaffold :dati ).
Praticamente funzionava mezzo fatto a mano e mezzo in maniera
automatica, cioè ho creato delle views per gestire cosa devono vedere,
fare, ecc. gli utenti, però la gestione dell’inserimento dei dati ed
altre cose se la gestiva rails via scaffold.
E’ andato tutto bene fino ad ora, che mi hanno chiesto di rendere
obbligatorio l’inserimento di alcuni dati. Naturalmente con un sistema
del genere aggiungendo al model opportuno il comando
“validates_presence_of” è saltato tutto.
Cercando in giro e nei manuali che ho, ho notato che tutti gli esempi
per creare la struttura di un’applicazione usavano lo scaffolding col
comando: “script/generate scaffold Cosa”, che crea tutta la struttura
col codice già scritto, tranne il programma passato da un conoscente che
si è fatto TUTTO a mano.
In preda alla disperazione (o quasi) ho provato a rifare l’applicativo
in questa maniera e a modificare quello che mi serviva e devo dire che
nonostante tutto sembrerebbe funzionare, ma non mi pare sia il
massimo…

Tirando le somme, sì, lo scaffold effettivamente è carino, ma alle volte
ti mette dei bei paletti; dall’altra parte, scriversi tutto è un bel
lavoraccio e se uno è come me che non sa l’html (ho visto che un po’ di
basi comunque servono) e non ha mai programmato, alle volte si trova
disorientato, specialmente perché rischia di trovarsi esempi in cui so
dice “Usa lo scaffold che si arrangia”… sì, vabbè, ma se io non
posso/voglio? Cosa combino?
Tanto per fare un esempio, la pagina di inserimento dati è
“nuovo.rhtml”; per inserire i dati li passa a “create” (gestito in
automatico via scaffold), ma naturalmente mettendoci l’obbligatorietÃ
dei campi, va tutto a farsi benedire perché come dicevo è una cosa
mista; usando lo saffold con codice esplicitato, invece, funziona tutto,
ma devo cambiare un bel po’ di cose e sperare di non fare boiate.

Non c’è mica da nessuna parte un bel manualozzo che spiega bene come
usare ROR anche senza lo scaffolding?

Scusate la logorrea, la prossima volta cercherò di essere più stringato
':slight_smile:

Daneel O.

premetto che non sono esperto.
Inserendo delle regole a livello di dati (model) lo scaffold le segue!
Se ad esempio imposti un campo come obbligatorio e nel form non lo
inserici, il record non viene generato e ti viene mostrato il messggio
di errore (tramite l’helper flash)