validation:只有字母,数字和 –

我想validation我的用户,因此他们只能在用户名中使用az和 – 。

validates_format_of :username, :with => /[az]/ 

但是这个规则也允许空格._ @

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

有任何想法吗?

最好的祝福。 AsbjørnMorell

您可能需要说整个字符串必须匹配:

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

如果您不想在开头/结尾处匹配换行符,则可能还需要使用\ A替换^和使用\ Z替换$。 (感谢BaroqueBobcat )

附加i将使其以不区分大小写的方式匹配。 (感谢Omar Qureshi )。

(我最初也离开了+ :感谢Chuck )

更复杂的解决方案,但可重用,并具有更细粒度的错误消息。

自定义validation器:

应用程序/validation/ 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 

[]可能包含几个“规则”,因此[a-z0-9]给出小写字母和数字

特殊性格 – 必须在规则的开头

是否

 [-a-z0-9@_.] 

给你想要的效果?

 validates_format_of :username, :with => /^[\w\-@]*$/ 

注意*,表示’0或更多’

只需更改正则表达式以匹配您的规范所声明的所有字符( \w涵盖所有字母数字字符 – 字母和数字 – 以及下划线)。

 validates_format_of :username, :with => /[\w \.\-@]+/