Multi-Modell-Speichern, wie man in Transaktions- und Berichtsfehler einbindet

8

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%
  1. Ich bin also verwirrt, wie ich Fehlermeldungen für all diese Modelle anzeigen kann, die
  2. speichern
  3. Wie kann die Validierung angezeigt oder fehlgeschlagen werden, wenn die reg_form nicht die korrekten Daten für alle anderen Modelle enthält?
  4. Wie kann ich sicherstellen, dass dies in eine Transaktion eingeschlossen wird, damit ich nichts speichere, wenn ein Modell während der Registrierung nicht speichern kann.
Blankman 01.08.2016, 01:29
quelle

2 Antworten

3

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:

%Vor%

Und wir ändern save so, dass diese Validierungen ausführt:

%Vor%

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:

%Vor%

In der Zwischenzeit sollte unser RegistrationsController in etwa so aussehen:

%Vor%

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 :

%Vor%

Bemerkenswerte Punkte:

  1. 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) .

  2. 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:

    %Vor%
  3. Wir können eine Datenbankausnahme ( wie eine E-Mail-Eindeutigkeitsbeschränkung ) in einen Fehler umwandeln etwas tun wie:

    %Vor%
  4. Wir können einen Fehler hinzufügen, der nicht direkt mit einem Attribut verknüpft ist, indem Sie das Symbol % co_de verwenden % :

    %Vor%
Ashitaka 07.08.2016, 01:21
quelle
0

Ich denke, Transaktionen und Fehlerbehandlung werden Ihnen helfen, Ihr Problem zu lösen.

%Vor%     
Arsen 06.08.2016 15:50
quelle

Tags und Links