2016-06-27 20 views
0

In meinem Modell, das ich den folgenden Code hinzugefügt habe, für die Validierung einer URL kann ein Benutzer eingeben:URL Validierung Schienen

validates :website, presence: true 
validates :website, format: { with: URI.regexp }, if: 'website.present?' 

Ich habe einen Test mit der einer ungültigen URL geschrieben:

http://example,nl 

Wenn ich den Test durchführe, sagt die Validierung, dass dies eine gültige Eingabe ist. Ich habe es im Programm selbst ausprobiert und dies ist eine akzeptierte URI. Gibt es eine Möglichkeit, den URI.regex so einzustellen, dass dies eine ungültige URL ist?

Antwort

1

URI.regexp gibt einen URI, die alle gültigen URIs übereinstimmen, aber a) es überprüft nicht, dass die Zeichenfolge nur dass URI, und b) Sie URLs zu überprüfen, nicht URIs (URI ist die breiterer Begriff).

Für a), können Sie die Regex nur ändern, anzupassen, wenn die Zeichenfolge durch Umwickeln sie in den ^ (Start-of-line) und $ (End-of-line) Symbole nur die URI ist:

validates :website, format: { with: /^#{URI.regexp.to_s}$/ }, if: 'website.present?' 

Für b) könnten Sie Ihren Anruf in URI.regexp(['http', 'https']) ändern, um die zulässigen Schemata einzuschränken, wodurch Sie näher kommen. Es gibt auch Edelsteine ​​für dieses Problem, wie valid_url. Oder akzeptieren Sie einfach, dass Ihre Validierung niemals perfekt sein wird.

+0

Dank Robert, ich habe die folgende Regex hinzugefügt, die funktioniert: /\ A (? :(?: https? | Http): \/\ /) (?: \ S + (? :: \ S *) ? @)? (? :(?! 10 (?: \. \ D {1,3}) {3}) (?! 127 (?: \. \ D {1,3}) {3}) (?! 169 \ .254 (?: \. \ D {1,3}) {2}) (?! 192 \ .168 (?: \. \ D {1,3}) {2}) (?! 172 \. (?: 1 [6-9] | 2 \ d | 3 [0-1]) (?: \. \ D {1,3}) {2}) (?: [1-9] \ d? | 1 \ d \ d | 2 [01] \ d | 22 [0-3]) (?: \. (?: 1? \ d {1,2} | 2 [0-4] \ d | 25 [0-5])) {2} (?: \. (?: [1-9] \ d? | 1 \ d \ d | 2 [0-4] \ d | 25 [0-4])) | (?: (?: [az \ u00a1- \ uffff0-9] + -?) * [az \ u00a1- \ uffff0-9] +) (?: \. (?: [az \ u00a1- \ uffff0 -9] + -?) * [Az \ u00a1- \ uffff0-9] +) * (?: \. (?: [Az \ u00a1- \ uffff] {2,}))) (? :: \ d {2,5})? (?: \/[^ \ S] *)? \ Z/i – PieterB