2016-09-19 6 views
0

Benutzer in meinem System müssen eindeutige E-Mails haben. Wenn ich versuche, einen Benutzer mit einer vorhandenen E-Mail zu erstellen, gibt der Controller einen Fehler aus und setzt alle Änderungen zurück.Update-Modell nach Validierung Fehler

Ich möchte einen Modell-Datensatz aktualisieren, wenn ein Dupe-E-Mail-Versuch unternommen wird. Das Rollback verhindert jedoch, dass Änderungen stattfinden, selbst wenn es sich in einem anderen Datensatz befindet. Ich habe versucht update_attribute, update_column und save(validate: false) aber keiner von ihnen funktioniert.

Wie kann ich den Rollback umgehen und einige Änderungen an einem (separaten) Modell vornehmen?

+0

An welchem ​​Punkt möchten Sie aktualisieren? Ich kann nicht zeigen, wie man tatsächlich einen neuen Datensatz erstellt, wenn E-Mail erforderlich/eindeutig ist, aber die Eindeutigkeit nicht besteht. Aber ich kann mir einen Weg vorstellen, der für die Aktualisierung eines bestehenden Datensatzes funktionieren könnte. Sie können das Fehlerobjekt des Modells verwenden, um zu überprüfen, ob die E-Mail-Validierung fehlgeschlagen ist, und dann Ihr Modell in einer separaten Anforderung aktualisieren. Zum Beispiel könnten Sie 'person.errors [: email]' verwenden, um nach Fehlern im E-Mail-Attribut der Person zu suchen, und wenn das E-Mail-Attribut der Person aktualisiert wurde (z. B.). –

+0

Haben Sie versucht, zu speichern (validate: false)? Nicht speichern (Validierung: falsch). – YTorii

+0

Im Idealfall passiert es in der gleichen Anfrage. Ich würde einen vorhandenen Datensatz bearbeiten und keinen neuen erstellen. Das Rollback scheint alle während der Anforderung vorgenommenen Änderungen rückgängig zu machen. Aber ich werde mich an dieser Stelle mit jeder Lösung zufrieden geben. – Dty

Antwort

1

In meinem Fall after_rollback macht den Trick.

Während eines Callbacks after_rollback überprüfe ich, ob Benutzer mit E-Mail vorhanden ist. Wenn dies der Fall ist, nehme ich an, dass der Rollback aufgrund einer fehlgeschlagenen Duplikat-E-Mail-Validierung erfolgte, und aktualisieren Sie dann den entsprechenden Datensatz.

+0

Ich habe den after_rollback callback vorher nicht gesehen. Ordentlich. Ich denke, dass Sie das Fehler-Objekt, dh 'person.errors [: email]' innerhalb des Callbacks verwenden könnten, um tatsächlich zu überprüfen, dass die Person einen Dupe-E-Mail-Fehler hat (anstatt Ihre DB erneut nach einer passenden E-Mail abzufragen), aber ich nicht Ich weiß nicht, ob es praktisch einen Unterschied machen würde. –

+0

Ich arbeite seit 4 Jahren mit Schienen und es ist das erste Mal, dass ich es auch sehe. Guter Ruf auf 'person.errors', definitiv eine bessere Idee. In meinem Fall aktualisiere ich die Metadaten des Original-Datensatzes, aber die Überprüfung von 'person.errors' ist viel übersichtlicher. – Dty

0

Wie wäre es mit on:: create Option für die Validierung von E-Mails? Mit dieser Option wird die Validierung nur in create und in update ausgeführt.

validates :email, uniqueness: true, on: :create 
+0

Danke, aber vielleicht bin ich nicht klar genug. Das löst mein Problem nicht. Ich versuche während eines Validierungsfehlers ein Update durchzuführen, und die Änderung bleibt nicht bestehen. – Dty

Verwandte Themen