Разработать проверку свойства электронной почты, исключая слова и @ myapp.com - PullRequest
0 голосов
/ 03 февраля 2012

Попытка проверить поле электронной почты в приложении rails devise с исключением слова.

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

, который прекрасно работает в поле: username, но не в электронной почте.

Я подозреваю, что Devise "взял на себя" проверку поля электронной почты, и мне нужно супер / отменить контроллер регистрации Devise.

Как я могу:

  • Запретить электронную почту со словами на основе: exclusion
  • Запретить электронную почту с @ myapp.com, чтобы пользователи не использовали доменприложение работает на.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

Вы всегда можете написать пользовательских проверок , чтобы достичь того, что вы хотите. Пример из руководства:

Самый простой способ добавить пользовательские валидаторы для проверки отдельных Атрибуты с удобным 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 голосов
/ 03 февраля 2012

После проверки, является ли это электронным письмом, я бы разделил две проверки.Один для исключения, а другой для домена.Вы можете получить текущий домен при использовании пассажира.

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
...