我有一个运行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."
答案 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