1

情况:

我有一个用户模型,需要通过列入黑名单的电子邮件地址列表进行验证。列入黑名单的电子邮件地址位于名为blacklist的额外模型中

模型/用户.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

模型/黑名单.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]blacklist总是nil。也许我的逻辑有问题?换句话说:是否有可能在没有关联的情况下访问另一个模型中的模型?

感谢您提前提供的帮助,并对现有的语言错误表示歉意。我不是以英语为母语的人:)

解决方案! 我错过了定义应该使用项目的哪个属性...

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

有时我的大脑不喜欢我喜欢的方式...

4

3 回答 3

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

这将比以前的更快

于 2012-09-28T12:54:01.390 回答
0

区分大小写。您正在搜索 blacklist-type = "E-Mail" 并且您的示例数据是 "e-mail"

于 2012-09-28T11:37:51.260 回答
0

要扩展我的评论,请尝试以下操作:

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
于 2012-09-28T12:06:52.367 回答