我想验证我的用户,因此他们只能在用户名中使用a-z和 - 。
validates_format_of :username, :with => /[a-z]/
但是这条规则也允许空格._ @
Username should use only letters, numbers, spaces, and .-_@ please.
有什么想法吗?
祝你好运。 AsbjørnMorell
答案 0 :(得分:16)
您可能需要说整个字符串必须匹配:
validates_format_of :username, :with => /^[-a-z]+$/
如果您不想在开头/结尾处匹配换行符,则可能还需要将\ A替换为^,将\ n替换为\ Z. (感谢BaroqueBobcat)
追加i将使其以不区分大小写的方式匹配。 (感谢Omar Qureshi)。
(我最初也离开了+
:感谢Chuck)
答案 1 :(得分:10)
更复杂的解决方案,但可重复使用,并且具有更细粒度的错误消息。
自定义验证程序:
应用程序/验证器/ 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
答案 2 :(得分:3)
[]可能包含几个“规则”,因此[a-z0-9]给出小写字母和数字
特殊字符 - 必须在规则的开头
[-a-z0-9@_.]
给你想要的效果?
答案 3 :(得分:1)
validates_format_of :username, :with => /^[\w\-@]*$/
注意*,表示'0或更多'
答案 4 :(得分:0)
只需更改正则表达式以匹配您的规范所声明的所有字符(\w
涵盖所有字母数字字符 - 字母和数字 - 以及下划线)。
validates_format_of :username, :with => /[\w \.\-@]+/