2009-07-16 4 views
9

Я хотел бы подтвердить мои пользователи, чтобы они могли использовать только a-z и - в их имени пользователя.Подтвердить: Только буквы, цифры и цифры -

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

Однако это правило также позволяет пространства ._ @

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

Любые идеи?

С уважением. Асбьёрн Морелл

+0

Это то, что я придумал: validates_format_of: имя пользователя,: с =>/^ [- аг \ d _] + $/ – atmorell

+0

Если у вас есть ответ который решает вашу проблему, вы должны отметить ее как принятую. –

ответ

3

код [] может содержать несколько «правил», поэтому [а-z0-9] дает строчные буквы и цифры

специальный символ - должен идти в начале правила

Does

[[email protected]_.] 

Дает ли эффект вы хотите?

+0

[-A-Za-z0-9 @ _.] <- в верхнем регистре, на всякий случай. – beggs

+0

он только просил a-z ;-) – djna

+0

Я бы предпочел отметить его как нечувствительный к регистру. – Svish

16

Возможно, вам сказать, вся строка должна соответствовать:

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

Вам также может понадобиться заменить^с \ А и $ с \ Z, если вы не хотите, чтобы соответствовать новой строки в начать конец. (спасибо BaroqueBobcat)

Добавление i приведет к тому, что оно будет соответствовать нечувствительным к регистру образом. (благодаря Omar Qureshi).

(я первоначально остановились +: благодаря Chuck)

+5

согласен, но как/^ [- a-z] $/i для нечувствительности к регистру –

+0

Вы всегда возвращаете недопустимый результат:/ – atmorell

+0

проверить его в irb .. re =/^ [-a-z] $/i; «foo» = ~ re –

0

Просто изменить регулярное выражение, чтобы соответствовать всем символам ваши спецификации состояний (\w охватывает все буквенно-цифровые символы - буквы и цифры - и подчеркивание) ,

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

Ваш пример довольно близок, однако пользователь все еще может использовать. и пространства. мой ....... новый пользователь – atmorell

+0

Здесь нет ограничений для предотвращения более длинных строк. Это будет соответствовать любой строке, содержащей хотя бы один из совпадающих символов. –

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

Обратите внимание на *, что означает «0 или более»

+0

Такая же проблема ... пробелы и. все еще разрешено:/ – atmorell

9

Более решение сложным, но многоразовые и с более мелкозернистыми сообщениями об ошибках.

валидатор:

приложения/валидаторы/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 

(Обратите внимание, это позволит - и не делает разрешающим не ASCII, для полноты '_.')

Использование:

приложение/модели/user.rb

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

Хороший ответ - это лишняя миля. –

Смежные вопросы