Как добавить проверку модели пользователя для блокировки определенных доменов электронной почты - PullRequest
1 голос
/ 14 марта 2012

Я хотел бы иметь список доменов электронной почты, которые проверены, чтобы предотвратить регистрацию в моем приложении.

10minutemail.com, yopmail.com, mail.com, mail.ru и т. Д. *

У меня есть список доменов в моей модели пользователя, например:

BAD_DOMAINS = [/10minutemail.com/, /yopmail.com/, /mail/

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

BAD_DOMAINS.each { |rule| return true if !domain.match(rule).nil? }

У меня работает это регулярное выражение, но как мне добавить его в качестве проверок? Я попробовал это:

validates :email, :format => { : exclusion => BAD_DOMAINS,
        :message => "%{value} no good." }

Спасибо

1 Ответ

2 голосов
/ 14 марта 2012

Вам нужно объединить все ваши отдельные регулярные выражения в единичное, но вам может оказаться, что это проще сделать, если у вас есть список строк вместо списка регулярных выражений:

EXCLUSION_DOMAINS = %w[
  example.com
  test.com
  asdf.com
]

EXCLUSION_REGEXP = Regexp.new('(?:' + EXCLUSION_DOMAINS.collect { |d| Regexp.escape(d) }.join('|') + ')$')

Вы хотите убедиться, что вещи не соответствуют этому, поэтому использовать его немного по-другому:

validates :email,
  :format => {
    :with => VALID_EMAIL_REGEXP,
    :without => EXCLUSION_REGEXP,
    :message => "%{value} no good."
  }

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

...