Nella mia app, ho a volte creare un utente al volo, e-mail di un utente deve essere un formato valido ed essere unicorotaie 3.1: come può App gestire diversi 'ragioni' per ActiveRecord :: RecordInvalid (ad esempio, duplicare vs errore di convalida)
Vorrei reindirizzare a luoghi diversi a seconda di quale convalida causato l'errore di essere sollevato: formato non valido vs duplicato.
Nel mio codice ho
begin
user.save!
flash[:notice] = "Created new user #{email} with password #{password}"
rescue ActiveRecord::RecordInvalid => e
flash[:alert] = "Failed to create account because #{e.message}"
redirect_to SOMEPLACE
end
Se l'email è formato non valido (come "user @ example") e.Message è "Validazione fallita: La posta elettronica è valido"
Se l'e-mail esiste già nella tabella, e.message è "Convalida non riuscita: l'e-mail è già stata presa"
Odio l'idea di analizzare il testo e.message per determinare il motivo ... c'è un modo migliore per un gestore di salvataggio per rilevare il motivo sottostante un'eccezione ActiveRecord :: RecordInvalid w come gettato?
P.S. So che in questo esempio posso semplicemente controllare in anticipo l'e-mail già esistente prima di fare un salvataggio, ma sto cercando di capire la soluzione generale per rilevare e agire su diversi fallimenti di convalida generando la stessa eccezione.
in realtà non può semplicemente controllare in anticipo per l'e-mail già esistente, convalide unicità di ActiveRecord sono soggetti a condizioni di gara e rotto in base alla progettazione. È necessario disporre di un vincolo di unicità all'interno del vostro database e devi essere preparato t o affrontare l'eccezione che solleverà (da '.save' o' .save! '). –