如何在rails上的ruby中验证特定的电子邮件模式

时间:2016-11-05 07:14:06

标签: ruby-on-rails validation

我目前正在设计一个注册页面,在我的model/user.rb文件中,如何指定只有这些以@gmail.com结尾的电子邮件地址才能成功注册? 谢谢

3 个答案:

答案 0 :(得分:1)

我会设置2个验证:

  • 第一个使用您首选的电子邮件正则表达式验证电子邮件地址是否有效(我提供了一个示例,source):

    EMAIL_REGEX = /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
    validates_format_of :email, with: EMAIL_REGEX
    
  • 验证电子邮件地址域名的第二个:

    GMAIL_DOMAINS = %w{gmail.com googlemail.com}
    
    validates :email_is_gmail
    
    private
    def email_is_gmail
      GMAIL_DOMAINS.each do |domain|
        return true if email.end_with?('@' + domain)
      end
    end
    

警告:

  • 关于第一次验证,我建议您确保代码的不同部分不使用不同的正则表达式来验证电子邮件地址。例如,如果您使用的是Devise,则应使用Devise.email_regexp代替EMAIL_REGEX。 (实际上,如果你使用Devise或类似的东西,你甚至不必自己验证电子邮件地址。)

    在代码的不同部分使用不同的正则表达式可能会导致创建具有在某些地方验证的电子邮件地址的帐户,但在其他地方验证失败。这可能会刺激最终用户。 (例如,请参阅维基百科页面上关于电子邮件地址的sub-addressing的最后一段,并想象一下有时允许+的网站,有时不允许。)

  • 正如@YOU在评论中提到的那样,按域名过滤可能并不完全符合您的要求。许多Google帐户不会以@gmail.com结尾(例如googlemail.com,甚至是使用GSuite使用自己的域名的任何商家)。如果您只想允许拥有Google帐户的人,我建议您查看Google Sign-In身份验证系统。
  • 有些人提倡不要使用正则表达式验证电子邮件地址:Stop Validating Email Addresses With Regex
      

    只需向他们发送电子邮件

答案 1 :(得分:0)

你可以这样做。

在你的模特中

validates :email, format: { with: /^[a-z0-9](\.?[a-z0-9]){5,}@g(oogle)?mail\.com$/i,
message: "Your message" }

您也可以更改正则表达式。

答案 2 :(得分:-1)

使用include之类的:

email= "user@gmail.com"

email.include? "@gmail.com" #returns true