Подтвердить: только буквы, цифры и - - PullRequest
11 голосов
/ 16 июля 2009

Я хотел бы проверить своих пользователей, чтобы они могли использовать только a-z и - в своем имени пользователя.

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

Однако это правило также допускает пробелы ._ @

Username should use only letters, numbers, spaces, and .-_@ please.

Есть идеи?

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

Ответы [ 5 ]

17 голосов
/ 16 июля 2009

Может потребоваться сказать, что вся строка должна совпадать:

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

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

Добавление i приведет к его сопоставлению без учета регистра. (спасибо Омару Куреши ).

(я тоже изначально остановился на +: спасибо Чаку )

10 голосов
/ 21 мая 2014

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

Пользовательский валидатор:

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

(Обратите внимание, что он разрешает '. - _' и не разрешает non ascii, для полноты)

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

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

validates :name,
    :presence => true,
    :uniqueness => true,
    :username_convention => true
3 голосов
/ 16 июля 2009

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

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

делает

[-a-z0-9@_.] 

дать желаемый эффект?

1 голос
/ 16 июля 2009
validates_format_of :username, :with => /^[\w\-@]*$/

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

0 голосов
/ 16 июля 2009

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

validates_format_of :username, :with => /[\w \.\-@]+/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...