Ich nehme an, dass Ihr Dollar-Betrag vom Dezimaltyp ist. Jeder Wert, den der Benutzer in das Feld eingibt, wird vor dem Speichern in die Datenbank von String in den entsprechenden Typ umgewandelt. Die Validierung gilt für die Werte, die bereits in numerische Typen konvertiert wurden. Daher ist Regex in Ihrem Fall kein geeigneter Validierungsfilter.
Sie haben mehrere Möglichkeiten, dies zu lösen, aber:
- Verwendung
validates_numericality_of
. Auf diese Weise verlassen Sie die Konvertierung komplett auf Rails und prüfen einfach, ob der Betrag in einem bestimmten Bereich liegt.
- Verwenden Sie
validate_each
Methode und Code Ihre Validierungslogik selbst (z. B. prüfen, ob der Wert mehr als 2 Dezimalstellen hat).
- Validate die attribute before it's been typecasted:
Dies ist besonders nützlich in Validierung Situationen, in denen der Benutzer könnte eine Zeichenfolge für eine ganze Zahl Feld liefern und Ihnen die Original-String zurück in einem Fehler angezeigt werden soll Botschaft. Der Zugriff auf das Attribut würde normalerweise den String auf 0 typisieren, was nicht das ist, was Sie wollen.
also in Ihrem Fall sollten Sie in der Lage sein zu verwenden:
validates_format_of :amount_before_type_cast, :with => /^[0-9]+\.[0-9]{2}$/, :message => "must contain dollars and cents, seperated by a period"
Beachten Sie jedoch, dass Benutzer könnte es langweilig finden Ihre starren Eingaberegeln zu folgen (ich würde wirklich in der Lage, am liebsten Geben Sie 500
stattdessen 500.00
, zum Beispiel), und dass in einigen Ländern Zeitraum keine Dezimaltrennzeichen (wenn Sie Ihre App internationalisieren möchten).
Gibt es einen Grund, warum Sie 'validates_numericality_of' anstelle von Regex verwenden? –
Wie würde ich 'validates_numericality_of' verwenden, um sicherzustellen, dass 500.001 fehlschlägt? Ich möchte nur, speziell formatiert, '[jede Zahl von 0 bis 9 Ziffern]. [2 von 0 bis 9 Ziffern]' - also mit 'validates_format_of: menge,: mit =>/^ [0-9] + \.[0-9] {2} $ /,: message => "muss Dollar und Cents enthalten, getrennt durch einen Zeitraum" ' –