2009-07-16 26 views
9

Ich möchte meine Benutzer validieren, so dass sie nur a-z und - in ihrem Benutzernamen verwenden können.Bestätigen: Nur Buchstaben, Zahlen und -

validates_format_of :username, :with => /[a-z]/ 

jedoch diese Regel erlaubt auch Räume ._ @

Username should use only letters, numbers, spaces, and [email protected] please. 

Irgendwelche Ideen?

Mit freundlichen Grüßen. Asbjørn Morell

+0

Das ist, was ich kam mit: validates_format_of: Benutzername,: mit =>/^ [- az \ d _] + $/ – atmorell

+0

Wenn Sie eine Antwort das dein Problem löst, solltest du es als akzeptiert markieren. –

Antwort

3

Die [] mehrere "Regeln" enthalten so [a-z0-9] Kleinbuchstaben und Zahlen

das Sonderzeichen gibt - zu Beginn der Regel gehen muss

Does

[[email protected]_.] 

geben Sie den gewünschten Effekt?

+0

[-A-Za-z0-9 @ _.] <- mit Großbuchstaben, nur für den Fall. – beggs

+0

er fragte nur nach a-z ;-) – djna

+0

Ich würde es eher als case insensitive markieren. – Svish

16

Unter Umständen müssen Sie die gesamte Zeichenkette sagen müssen übereinstimmen:

validates_format_of :username, :with => /^[-a-z]+$/ 

Sie auch^mit \ A ersetzen müssen und mit \ Z $, wenn Sie nicht wollen, eine neue Zeile in die passen Start Ende. (Danke an BaroqueBobcat)

Anhängen an ich werde es in einer Groß-und Kleinschreibung nicht übereinstimmen. (Danke an Omar Qureshi).

(I ursprünglich aus auch die + links: dank Chuck)

+5

vereinbart, aber als/^ [- a-z] $/i für Groß-/Kleinschreibung –

+0

Ihr Beispiel gibt immer ungültig:/ – atmorell

+0

testen Sie es in irb .. re =/^ [- a-z] $/i; "foo" = ~ re –

0

einfach den regulären Ausdruck ändern, um alle Zeichen Ihrer Spezifikation Staaten (\w deckt alle alphanumerischen Zeichen - Buchstaben und Zahlen - und einen Unterstrich) übereinstimmen .

validates_format_of :username, :with => /[\w \.\[email protected]]+/ 
+0

Ihr Beispiel ist ziemlich nah, aber der Benutzer kann immer noch verwenden. und Räume. mein ....... neuer Benutzer – atmorell

+0

Es gibt keine Grenzen, um zu verhindern, dass längere Zeichenfolgen übereinstimmen. Dies entspricht einer beliebigen Zeichenfolge, die mindestens eines der übereinstimmenden Zeichen enthält. –

1
validates_format_of :username, :with => /^[\w\[email protected]]*$/ 

Beachten Sie die *, die ‚0 oder mehr‘

+0

Gleiches Problem ... Leerzeichen und. ist noch erlaubt:/ – atmorell

9

Komplexere Lösung aber wieder verwendbar und mit mehr feinkörnigem Störmeldeversand bedeutet.

Individuelle Validator:

app/Validatoren/username_convention_validator.rb

class UsernameConventionValidator < ActiveModel::EachValidator 
    def validate_each(record, field, value) 
    unless value.blank? 
     record.errors[field] << "is not alphanumeric (letters, numbers, underscores or periods)" unless value =~ /^[[:alnum:]._-]+$/ 
     record.errors[field] << "should start with a letter" unless value[0] =~ /[A-Za-z]/ 
     record.errors[field] << "contains illegal characters" unless value.ascii_only? 
    end 
    end 
end 

(Beachten Sie es nicht erlaubt - und tut nicht ascii erlauben, für Vollständigkeit halber '_.')

Verwendung:

app/models/user.rb

validates :name, 
    :presence => true, 
    :uniqueness => true, 
    :username_convention => true 
+1

Schöne Antwort - es geht die Extrameile. –

Verwandte Themen