2011-01-20 61 views
3

爲我的rails3,設計,用戶模型(名稱,電子郵件等...)我想防止在網站上註冊不好的域名。Rails - validates_each只允許某些電子郵件?

這個想法是我有一個列入黑名單的域(badplace.com,hotmail.com)...當新的用戶記錄被保存時,我檢查電子郵件,如果它有一個壞域域,我添加一個錯誤。

那麼什麼是巧妙地在Rails中實現這個正確的方式...

這就是我一直在玩:

在用戶模式

protected 
    validates_each :email, :on => :create do |record, attr, value| 
    domain = email.split("@").last 
    record.errors.add attr, "That's a BAD EMAIL." unless value && !value.contains(domain) 
    end 

你怎麼看?

回答

4

你可以用一個validates_format_of和正則表達式這樣做更容易:

class User < ActiveRecord::Base 
    validates_format_of :email, :without => /badplace\.com|hotmail\.com/, :message => "That's a BAD EMAIL." 
end 

編輯:

對於許多地址,你可以做這樣的事情:

INVALID_EMAILS = %w(badplace.com hotmail.com) 
validates_format_of :email, :without => /#{INVALID_EMAILS.map{|a| Regexp.quote(a)}.join('|')}/, :message => "That's a BAD EMAIL." 
+0

感謝指出這一點。這裏問題是我會有幾十個不好的電子郵件。可以不是一個var?另外,消息有什麼作用?我不想添加record.errors,因此表單可以顯示出錯的地方,請確定消息是否自動執行? thxs – AnApprentice 2011-01-20 22:54:25