0

试图验证电子邮件领域的轨道设计应用程序与词语排除。设计验证电子邮件属性,排除单词和@ myapp.com

validates :email, :exclusion => {:in => ["admin", "root",, 
            :message => "is reserved"} 

至极的伟大工程:用户名字段,但不上的电子邮件。

我怀疑Devise是“接管”了电子邮件字段的验证,我需要超级/否决Devise的注册控制器。

我怎么能:

  • 防止邮件基于一个字:排除
  • 防止电子邮件与@ myapp.com所以用户不使用的应用程序运行在域。

回答

2

你总是可以编写custom validations达到你想要的东西。从引导例如:

添加自定义的验证器,用于验证个人 属性最简单的方法就是与加载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 
+0

我终于在我的模型中使用了一个def方法,并且验证了my_method以获得它的固定感谢指出上面应该很快就派上用场 – Rubytastic 2012-02-03 14:35:35

0

检查,如果它是一个电子邮件后,我会分成两个验证。一个用于排除,另一个用于域。使用乘客时,您可以检索当前的域名。

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