如何添加用户模型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的协议。