2011-01-20 63 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