2015-11-03 41 views
0

我試圖讓我的代碼保持乾爽。Rails:如何爲驗證和類方法使用單個正則表達式規則?

我想要做的是這樣的:

class User < ActiveRecord::Base 
    validates :username, format { with: /\A[:alnum:]+\z/} 

    def self.create_with_username(name) 
    username = name.match(/\A[:alnum:]+\z/) if name 
    end 
end 

我複製正則表達式匹配規則:/\A[:alnum:]+\z/

我的問題是如何讓/\A[:alnum:]+\z/幹,這樣我可以用它在驗證和.match方法中?到目前爲止,我嘗試了一個類方法,但驗證似乎沒有把它拿起來。當我嘗試使它成爲一個常量時,.match方法不會提取它(可能導致.match方法在類方法中...)

謝謝。

+0

你是幹什麼意思? –

+0

@AvinashRaj幹:不要重複自己。我想將正則表達式規則捕獲到一個對象中,並將其用於驗證,我的.match方法 –

+0

您應該添加一些關於阻止您「按預期方式使用」的問題的信息,例如您得到的錯誤或意外結果。 –

回答

0

你需要把POSIX類字符類中..

\A[[:alnum:]]+\z 
0

,可以儲存格式爲常數或一個類的方法,而不是一個局部變量:

#constant 
USERNAME_FORMAT = /\A[:alnum:]+\z/ # <-- What I want to keep DRY 

#class method 
def self.username_format 
    /\A[:alnum:]+\z/ 
end 

那麼你可以說(使用不變的例子)

validates :username, format { with: USERNAME_FORMAT} 

def self.create_with_username(name) 
    username = name.match(USERNAME_FORMAT) if name 
end 
+0

但是,你需要在括號表達式中使用POSIX字符類。 –