2009-07-16 108 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:用户名:用=>/^ [ - AZ \ d _] + $/ – atmorell 2009-07-17 13:11:50

+0

当你有一个答案解决您的问题,您应该将其标记为已接受。 – 2016-02-11 00:56:40

回答

3

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

特殊字符 - 必须在规则

是否开始

[[email protected]_.] 

给你想要的效果?

+0

[-A-Za-z0-9 @ _。] < - 用大写字母,以防万一。 – beggs 2009-07-16 08:26:28

+0

他只要求一个-z ;-) – djna 2009-07-16 08:53:12

+0

我宁愿将它标记为不区分大小写。 – Svish 2009-07-16 08:53:56

16

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

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

您可能还需要与\ A来代替^和$使用\ Z,如果你不想要匹配的换行符开始/结束。 (感谢BaroqueBobcat

追加一个我会使它匹配不区分大小写的方式。 (感谢Omar Qureshi)。

(我最初也不放过+:感谢Chuck

0

简单地改变正则表达式匹配的所有字符的规范状态(\w涵盖所有字母数字字符 - 字母和数字 - 和下划线) 。

validates_format_of :username, :with => /[\w \.\[email protected]]+/ 
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