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