2009-07-16 159 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