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%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:
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:
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).
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% 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.
Tags und Links ruby-on-rails activerecord enums select