10 Stimmen

Rails benutzerdefinierte Validierung basierend auf einem Regex?

Ich habe die folgende Regex, die ich in meiner routes.rb für /type-in-something-here verwende

# A-Z, a-z, 0-9, _ in the middle but never starting or ending in a _
# At least 5, no more than 500 characters

Bei den Routen funktioniert das gut:

match ':uuid' => 'room#show', :constraints => { :uuid => /[A-Za-z\d]([-\w]{,498}[A-Za-z\d])?/ }

Ich möchte dies auch als Validierung haben, damit keine ungültigen Datensätze erstellt werden. Also habe ich folgendes zu room.rb hinzugefügt:

validates_format_of :uuid, :with => /[A-Za-z\d]([-\w]{,498}[A-Za-z\d])?/i, :message => "Invalid! Alphanumerics only."

Aber dieses validates_format_of funktioniert nicht, und anstatt einen Fehler hinzuzufügen, lässt es den Datensatz speichern.

Haben Sie eine Idee, was los ist?

感謝

17voto

molf Punkte 70728

Denken Sie daran, zu Validierungszwecken den Anfang und das Ende der Zeichenkette zu markieren \A y \Z :

validates_format_of :uuid, :with => /\A[A-Za-z\d]([-\w]{,498}[A-Za-z\d])?\Z/i

Andernfalls wird Ihre Regex mit jeder Zeichenfolge übereinstimmen, die mindestens einen Buchstaben oder eine Ziffer enthält. Aus irgendeinem Grund fügt Rails implizit die Grenzen in den Routen hinzu (wahrscheinlich weil es die Regex in eine größere einbettet, um die gesamte URL abzugleichen, mit expliziten Prüfungen für / und das Ende der URL).

11voto

Nikhil Punkte 1268

Und zwar in etwa so

validates :uuid, :format => {:with => /[A-Za-z\d]([-\w]{,498}[A-Za-z\d])?/i},
                 :message => "your message"

Mehr dazu unter este

5voto

Nimish Punkte 1016
validates :name, format: { with: /\A[a-zA-Z]+\z/,
message: "Only letters are allowed" }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X