Пользовательский валидатор электронной почты Rails | Черный список

Ситуация:

У меня есть модель user, которую нужно проверить списком адресов электронной почты из черного списка. Адреса электронной почты из черного списка находятся в дополнительной модели под названием черный список.

модели / user.rb:

    class User < ActiveRecord::Base
            validate :email_is_not_blacklisted

            def email_is_not_blacklisted
                    @blacklist = Blacklist.where(:blacklist_type => "E-Mail")

                    @blacklist.each do |item|
                            errors.add(:email, 'is blacklisted') if self.email.match(item)
                    end
            end
    end

модели / blacklist.rb

    class Blacklist < ActiveRecord::Base
            attr_accessible :name, :blacklist_type

            #some validation code for blacklist items ...
    end

Примеры записей в черном списке

    #:        name,            blacklist_type
    #1:       'demo-mail.com', 'E-Mail'
    #2:       'test123.com',   'E-Mail'

Модель черного списка также будет использоваться для запрета определенных имен пользователей в будущем!

Проблема:

Моя проблема в том, что [at] черный список всегда ноль. Может что-то не так с моей логикой? Другими словами: можно ли получить доступ к модели внутри другой модели без согласования?

Заранее благодарим за помощь и приносим извинения за существующие языковые ошибки. Я не родной английский :)

РЕШЕНИЕ! Я пропустил определение, какой атрибут элемента следует использовать ...

    errors.add(:email, 'is blacklisted') if self.email.match(item.name)

Иногда моему мозгу не нравится то, что мне нравится ...


person malcom    schedule 28.09.2012    source источник
comment
Хм, так что в принципе можно получить доступ к Blacklist из User, иначе вы получите исключение ... Однако попробуйте изменить @blacklist на _4 _... я думаю, что валидаторы вызываются как методы класса, а не методы экземпляра (и, следовательно, не есть экземпляры vars)   -  person mhutter    schedule 28.09.2012


Ответы (3)


Я предлагаю вам использовать это

class User < ActiveRecord::Base
  validate :email_is_not_blacklisted

  def email_is_not_blacklisted
    if Blacklist.find_by_blacklist_type_and_name("E-Mail",self.email)
       errors.add(:email, 'is blacklsited') 
    end
  end
end

это будет быстрее, чем предыдущие

person Aayush Khandelwal    schedule 28.09.2012
comment
Да, я тоже думаю, что это будет работать быстрее, но черный список может содержать только заблокированное доменное имя. Поэтому я должен проверить это с помощью match / regex = / - person malcom; 01.10.2012

Чувствительность к регистру. Вы ищете blacklist-type = "E-Mail", а ваш пример данных - "e-mail".

person Yule    schedule 28.09.2012
comment
Приносим извинения за эту ошибку! Я исправил свой вопрос, чтобы обеспечить согласованность данных :) В моей базе данных blacklist_type такой же, как и в моем условии where. - person malcom; 28.09.2012
comment
вы уверены, что @blacklist равно нулю. Вы не могли получать ошибки, так как ваше условие if выглядит некорректно. - person Yule; 28.09.2012
comment
Спасибо, приятель :) Я пропустил, чтобы объявить, какой атрибут элемента должен использоваться ... Ошибка nil неприемлема ... моя точка отладки была на один шаг раньше, чем раньше. - person malcom; 28.09.2012

Чтобы расширить мой комментарий, попробуйте следующее:

class User < ActiveRecord::Base
  validate :email_is_not_blacklisted

  def email_is_not_blacklisted
    Blacklist.find_all_by_blacklist_type("E-Mail").each do |item|
      errors.add(:email, 'is blacklsited') if.self.email.match(item)
    end
  end
end
person mhutter    schedule 28.09.2012