W mojej aplikacji czasami utworzę użytkownika w locie, a adres e-mail użytkownika musi być prawidłowym formatem i być wyjątkowym.rails 3.1: w jaki sposób aplikacja może obsługiwać różne "powody" dla ActiveRecord :: RecordInvalid (na przykład duplikat vs błąd sprawdzania poprawności)
Chciałbym przekierować do różnych miejsc w zależności od tego, KTÓRYCH walidacja spowodowała błąd: nieprawidłowy format kontra duplikat.
W moim kodu mam
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
Jeśli e-mail jest nieprawidłowy format (takich jak „użytkownik @ przykład”) e.message jest „Validation nie powiodło się: E-mail jest nieprawidłowy”
Jeśli e-mail już istnieje w tabeli, e.message to "Sprawdzanie poprawności nie powiodło się: wiadomość e-mail została już podjęta"
Nienawidzę idei analizowania tekstu e.message w celu ustalenia przyczyny ... czy istnieje lepszy sposób na obsługę ratunkową aby wykryć przyczynę powodującą wyjątek ActiveRecord :: RecordInvalid w jako wyrzucony?
P.S. Wiem, że w tym przykładzie mogę po prostu sprawdzić wcześniej e-mail już istniejący przed wykonaniem zapisu, ale staram się zrozumieć ogólne rozwiązanie do wykrywania i działania na różnych błędach walidacji rzucając ten sam wyjątek.
W rzeczywistości nie można po prostu sprawdzić wcześniej e-mail już istnieje, walidacja ActiveRecord walidacji podlegają warunki wyścigu i zepsute przez projekt.Musisz mieć ograniczenie wyjątkowości w bazie danych i musisz być przygotowany poradzić sobie z wyjątkiem, że będzie się podnosił (z '.save' lub' .save! '). –