如何添加用户模型validation以阻止某些电子邮件域
我希望有一个经过validation的电子邮件域列表,以防止在我的应用程序上注册。
10minutemail.com,yopmail.com,mail.com,mail.ru等…
我的用户模型中有一个域列表,如下所示:
BAD_DOMAINS = [/10minutemail.com/, /yopmail.com/, /mail/
我想在电子邮件字段中添加用户validation,以便在用户注册其中一个域时添加错误。
BAD_DOMAINS.each { |rule| return true if !domain.match(rule).nil? }
我有正则表达式工作,但如何将其作为validation添加? 我试过这个:
validates :email, :format => { : exclusion => BAD_DOMAINS, :message => "%{value} no good." }
谢谢
您需要将所有单独的正则表达式组合成单个正则表达式,但如果您有一个字符串列表而不是正则表达式列表,您可能会发现它更容易实现:
EXCLUSION_DOMAINS = %w[ example.com test.com asdf.com ] EXCLUSION_REGEXP = Regexp.new('(?:' + EXCLUSION_DOMAINS.collect { |d| Regexp.escape(d) }.join('|') + ')$')
您需要确保事情与此不符,因此使用时有点不同:
validates :email, :format => { :with => VALID_EMAIL_REGEXP, :without => EXCLUSION_REGEXP, :message => "%{value} no good." }
您应该使用某种有效的电子邮件测试程序,以确保地址合理。 它在这里表示为VALID_EMAIL_REGEXP
,它是某种电子邮件validation器正则表达式。 如果您这样做,请尝试使用符合RFC的协议。