Rails 4.1 enum löst einen Fehler aus und setzt das Objekt stattdessen als ungültig

8

Ich benutze das Rails 4.1 enum Feld

%Vor%

Wenn sich der Benutzer anmeldet, wählt er aus einer Auswahlbox seine Kategorie aus. Der Standardwert ist leer, da ich den Benutzer zwingen möchte, eine Option auszuwählen.

Wenn der Benutzer keine Option auswählt, möchte ich mit einer Bestätigungsmeldung zum Formular zurückkehren. Hier ist der Select-Box-Code im Anmeldeformular

%Vor%

Wenn der Controller den Benutzer erstellt, anstatt einen Überprüfungsfehler zum Datensatz hinzuzufügen, wird eine Ausnahme ausgelöst. Wie vermeide ich das?

%Vor%     
Daniel Cukier 28.07.2014, 15:54
quelle

4 Antworten

2

Ich mag die Argumentation, wie sie in dem oben genannten Problem dargelegt wurde, wirklich nicht. Da der Wert über die Leitung kommt, sollte er wie eine Freitexteingabe behandelt werden, bei der die Validierung im Modell und nicht im Controller erwartet wird. Dies trifft insbesondere auf APIs zu, bei denen die Entwickler noch weniger Einfluss haben, wenn beispielsweise die Eingabe von Formulardaten erwartet wird.

Falls jemand einen Hack will, hier ist, was ich mir ausgedacht habe. Besteht grundlegende Tests, würde aber gerne Rückmeldungen erhalten, wenn jemand Probleme damit hat:

%Vor%

Dies setzt die Kategorie auf nil zurück und wir können das Feld dann validieren:

%Vor%

Das Problem ist, dass wir wirklich inclusion validieren wollen, nicht nur presence . Um das zu umgehen, müssen wir die Eingabe erfassen (z. B. wie oben in def category= ). Dann können wir unsere Nachricht mit diesem Wert ausgeben:

%Vor%

Das wird uns Botschaften für Präsenz und Einbeziehung geben. Wenn Sie es genauer einstellen müssen, müssten Sie einen benutzerdefinierten Validator verwenden (glaube ich).

    
jonuts 30.05.2016 10:56
quelle
1

Lesen Sie: Ссылка

Lesen Sie speziell Senny :

  

Der aktuelle Fokus von AR-Enums besteht darin, aus Gründen der Performance eine Reihe von Zuständen (Labels) einer Ganzzahl zuzuordnen. Die Zuweisung eines falschen Status wird als Fehler auf Anwendungsebene und nicht als Benutzereingabefehler betrachtet. Deshalb erhalten Sie einen ArgumentError.

Damit können Sie immer nil oder eine leere Zeichenfolge für das enum-Attribut festlegen, ohne einen Fehler zu erzeugen:

%Vor%

und fügen Sie eine einfache Anwesenheitsvalidierung hinzu wie:

%Vor%     
DanielBlanco 05.12.2014 17:41
quelle
1

Der enum in Rails löst immer einen Fehler aus, wenn Sie versuchen, einen ungültigen Wert zu setzen. Es gibt keine solche Validierung und fügt eine Fehlermeldung zu base hinzu oder fügt dem Datensatz einen Validierungsfehler hinzu. Sie sollten eine eigene Validierung durch rescue errors erstellen.

%Vor%     
Зелёный 28.07.2014 16:03
quelle
0

Falls jemand noch damit zu kämpfen hat. Sie können eine standardmäßige Aufnahme wie folgt (im Benutzermodell) hinzufügen:

%Vor%     
Kamen 28.03.2016 14:20
quelle