带设计的Rails只允许学校发送电子邮件

时间:2015-09-06 06:27:15

标签: ruby-on-rails ruby regex devise

我有一个运行Ruby on Rails with Devise的应用程序用于用户管理。但是,当用户修改其帐户或新用户注册时,我只希望允许他们使用我学校的电子邮件地址,因此必须包含@ uwo.ca

但是,我想找到一个解决方案,允许我将来添加更多电子邮件..

我在网上找到了这个代码,但我不确定把它放在哪里

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

2 个答案:

答案 0 :(得分:4)

这是验证。它在你的模型中。有关验证的完整Rails指南:Active Record Validations。在编写更多代码之前,请先阅读它。

您发布的代码显然是用于将多个电子邮件域(ergo INVALID_EMAILS)列入黑名单,这使得它不适合您的目的,即将单个域列入白名单。它也不是一个非常好的代码。您要做的就是验证电子邮件地址是否以@uwo.ca结尾,这意味着您希望它与正则表达式/@uwo\.ca$/匹配。为此,验证将如下所示:

validates_format_of :email, :with => /@uwo\.ca$/,
  :message => "That's a bad email."

另外,请考虑使用I18n作为错误消息,而不是在模型中对其进行硬编码。

答案 1 :(得分:0)

我认为制定自定义验证是更好的方法。

这个怎么样?

class User < ActiveRecord::Base
  VALID_EMAILS = %w(uwo\.ca, example\.com)
  validate :validate_email_formats

  def validate_email_formats
    VALID_EMAILS.each do |email_format|
      return if self.email.to_s =~ /.+@#{email_format}$/
    end
    errors.add(:email, "is a BAD EMAIL.")
  end
end