尝试使用单词exclusion验证rails design应用程序中的电子邮件字段。
validates :email, :exclusion => {:in => ["admin", "root",,
:message => "is reserved"}
Wich在:username字段上工作得很好,但在电子邮件上则不然。
我怀疑Devise"接管"了电子邮件字段的验证,我需要超级/否决Devise的注册控制器。
我怎么能:
- 阻止包含基于排除的单词的电子邮件
- 禁止使用@myapp.com发送电子邮件,这样用户就不会使用该应用运行的域
您总是可以编写自定义验证来实现您想要的。指南示例:
添加用于验证个人的自定义验证器的最简单方法属性与方便的ActiveModel::EachValidator一起使用。在这个在这种情况下,自定义验证器类必须实现validate_each方法它有三个参数:记录、属性和值对应于实例、要验证的属性和传递实例中属性的值。
class EmailValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
unless value =~ /A([^@s]+)@((?:[-a-z0-9]+.)+[a-z]{2,})z/i
record.errors[attribute] << (options[:message] || "is not an email")
end
end
end
class Person < ActiveRecord::Base
validates :email, :presence => true, :email => true
end
在检查它是否是一封电子邮件后,我会将两个验证分开。一个用于排除,另一个用于域。您可以在使用passenger时检索当前域。
validate :email_username_is_not_on_blacklist, :email_domain_is_allowed
EXCLUDED_USERNAMES = "admin", "root"
EXCLUDED_DOMAINS = "myapp.com"
def email_username_is_not_on_blacklist
user, domain = email.split("@")
errors.add(:email, "E-mail user is not allowed") if self.class.EXCLUDED_USERNAMES.include?(user)
end
def email_domain_is_allowed
user, domain = email.split("@")
errors.add(:email, "E-mail domain is not allowed") if self.class.EXCLUDED_DOMAINS.include?(domain)
end