Ich habe ein Registrierungsformular-Modell, das die Benutzer während der Registrierung eingibt:
%Vor%Während dieses Registrierungsprozesses müssen mehrere Modelle erstellt werden, und ich bin mir nicht sicher, wie Fehlermeldungen korrekt angezeigt werden und wie die Modellfehlermeldungen an die Benutzeroberfläche zurückgegeben werden.
%Vor%Konto.erschaffen! sieht so aus:
%Vor%Fangen wir von vorne an.
Wir möchten, dass unser Registrierungsformularobjekt dieselbe API wie jedes andere ActiveRecord-Modell hat:
%Vor%Dafür erstellen wir folgendes Objekt:
%Vor% Jetzt, indem wir ActiveModel::Model
einbeziehen, erhält unsere RegForm
eine Menge Funktionalität, einschließlich der Anzeige von Fehlern und der Validierung von Attributen (ja, es ist unnötig, ActiveModel::Validations
einzubeziehen). In diesem nächsten Schritt fügen wir einige Validierungen hinzu:
Und wir ändern save
so, dass diese Validierungen ausführt:
validate
gibt true
zurück, wenn alle Validierungen bestanden werden und false
andernfalls.
validate
fügt außerdem Fehler zu @reg_form
(Alle ActiveRecord-Modelle) hinzu Haben Sie einen errors
Hash, der ausgefüllt wird, wenn eine Validierung fehlschlägt. Das bedeutet, dass wir in der Ansicht eines davon tun können:
In der Zwischenzeit sollte unser RegistrationsController
in etwa so aussehen:
Wir können deutlich sehen, dass, wenn @reg_form.save
false
zurückgibt, die new
-Ansicht erneut gerendert wird.
Schließlich ändern wir save
so, dass unsere Modelle save
-Aufrufe in eine Transaktion
Bemerkenswerte Punkte:
create!
wird anstelle von create
verwendet. Die Transaktion wird nur zurückgesetzt, wenn eine Ausnahme ausgelöst wird (welche Methoden mit einem Knall normalerweise tun) .
validate
ist nur ein Alias für valid?
. Um diese Einrückung zu vermeiden, könnten wir stattdessen einen Wächter oben in der Methode save
verwenden:
Wir können eine Datenbankausnahme ( wie eine E-Mail-Eindeutigkeitsbeschränkung ) in einen Fehler umwandeln etwas tun wie:
%Vor%Wir können einen Fehler hinzufügen, der nicht direkt mit einem Attribut verknüpft ist, indem Sie das Symbol % co_de verwenden % :
%Vor%Tags und Links ruby-on-rails validation