Более сложное решение, но пригодное для повторного использования и с более мелкими сообщениями об ошибках.
Пользовательский валидатор:
приложение / валидаторов / 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