Ruby on Rails Active Record-Rückgabewert beim Erstellen schlägt fehl?

7

Ich bin neu auf Rubinen und habe Schwierigkeiten, diese Arbeit zu bekommen. Grundsätzlich habe ich eine Benutzerregistrierungsseite, die eine Passwortbestätigung hat. In der Benutzerklasse habe ich folgende Validierung:

%Vor%

Und in der Steuerung habe ich

%Vor%

Das Problem ist, dass wenn das Passwort mit der Bestätigung übereinstimmt, ich immer noch die Nachricht erhalte, dass die Registrierung erfolgreich ist. Wie Sie sehen können, habe ich mehrere Rückgabewerte für create ausprobiert, aber keiner von ihnen scheint erfolgreich zu sein. Ich bin mir ziemlich sicher, dass die Validierung funktioniert, weil ich den Benutzer, den ich gerade erstellt habe, nicht sehen kann, wenn das Passwort nicht mit der Bestätigung übereinstimmt. Wenn ich create! verwende, kann ich außerdem feststellen, dass die Website mit dem Validierungsfehler abstürzt. Kann mir jemand sagen, was create zurückgeben soll, wenn der Datensatz nicht validiert wird?

Danke.

    
zyl1024 01.06.2014, 00:55
quelle

2 Antworten

22

Die Antwort auf Ihre Frage lautet: User.create gibt eine User -Instanz zurück, wenn es erfolgreich ist oder fehlschlägt. Wenn es aufgrund von Validierungen fehlschlägt, ist die Instanz ungültig und enthält Fehler:

%Vor%

Also würde sich Ihr Code davon ändern:

%Vor%

dazu:

%Vor%

Sie können dieses Muster auch verwenden:

%Vor%

Die save -Methode gibt einen booleschen Wert von false zurück, da Sie ihn für eine vorhandene Instanz aufrufen.

Aber lassen Sie uns auf andere Weise auf die richtige Spur kommen:

Erstens: Sie haben das:

%Vor%

(Ich gehe davon aus, dass exits eine Methode ist, die Sie auf Ihr User -Modell anwenden, weil das keine Rails-Sache ist). Anstatt dies in Ihrem Controller zu überprüfen, können Sie einfach eine andere Validierung für das Modell verwenden:

%Vor%

Wenn Sie jetzt versuchen, den Benutzer zu erstellen, wird die Validierung fehlschlagen, wenn Sie bereits eine mit diesem Namen haben.

Zweitens: Sie haben Folgendes:

%Vor%

Dies ist unnötig. Wenn Sie Ihrem Modell eine Spalte namens created_at hinzufügen, wird das Erstellungsdatum automatisch beibehalten (verwaltet von ActiveRecord). Sie können dies und seinen Partner updated_at in Ihrer Migration wie folgt zu Ihrem Modell hinzufügen:

%Vor%

Oder Sie haben bereits eine Tabelle users :

%Vor%

Jetzt haben Sie immer das Datum / die Uhrzeit der Erstellung und letzten Aktualisierung Ihres Benutzermodells, ohne dass zusätzlicher Code benötigt wird.

Drittens: Sie haben Folgendes:

%Vor%

Tu das nicht. Ändere das stattdessen:

%Vor%

Dazu:

%Vor%

Und dann den Schutz eingeschaltet lassen:

%Vor%

Sie können zusätzliche Spalten hinzufügen, die Sie von Ihrem Formular in den permit() -Aufruf bringen möchten. Dies ist sehr wichtig, weil es schwierig ist, dies später zu beheben. "Wenn du einmal den dunklen Pfad hinuntergehst, wird es für immer dein Schicksal beherrschen."

Vierte: Sie sollten nicht zum Benutzerpfad umleiten, wenn das Speichern fehlgeschlagen ist, da kein Benutzermodell angezeigt werden soll. Stattdessen sollten Sie Ihr new Formular erneut rendern. Sie benötigen auch keine Flash-Nachrichten für die Fehler. Wenn das new -Formular gerendert wird, kann @user.errors überprüft und Fehlermeldungen entsprechend gemeldet werden. Weitere Informationen finden Sie in der ActiveRecord-Fehlerobjektdokumentation .

Schließlich: Sie erwähnen, dass Ihre Validierung fehlschlägt, selbst wenn Ihr Passwort ordnungsgemäß bestätigt wurde. Ich kann nicht sicher sagen, ohne Ihren Formularcode zu sehen, aber stellen Sie sicher, dass Ihr Passwortfeld password heißt und das Bestätigungsfeld password_confirmation heißt. Rails sucht bei der Validierung für die Bestätigung nach diesem *_confirmation -Feldwert.

Wenn das nicht funktioniert, poste deinen Formularcode und ich überarbeite ihn.

    
gwcoffey 01.06.2014, 01:12
quelle
0

Die Antwort lautet ActiveRecord object . Der offizielle Quellcode zeigt, dass create das Objekt zurückgibt, wenn es erfolgreich ist oder fehlschlägt:

%Vor%

Wie man beurteilt, ob es erfolgreich ist oder nicht funktioniert

Die wirkliche Antwort ist persisted? :

%Vor%

Warum hat user.valid? das nicht getan? Denn manchmal ist es nicht genug, wenn es Callbacks gibt, bei denen andere Modelle fehlschlagen:

%Vor%

Nun führen wir aus One.create wird fehlschlagen, überprüfen Sie die Protokolldatei, es wird ein Rollback sein, weil es zwei nicht erstellen konnte. In diesem Fall gibt One.create.valid? immer noch true zurück, aber es ist tatsächlich fehlgeschlagen. Verwenden Sie daher One.create.persisted? , um es zu ersetzen.

Hinweis: Der Code wurde in Rails 5.1 getestet.

    
pinewong 07.09.2017 08:43
quelle