【问题标题】:Write a custom validation method to prevent bots编写自定义验证方法以防止机器人
【发布时间】:2015-06-05 10:19:24
【问题描述】:

我正在尝试向我的用户模型添加验证。

我想阻止人们注册“Bot”表中存在的邮件。

Bot表结构为:

create_table "bots", force: :cascade do |t|
    t.string   "banned_domains"
    t.datetime "created_at"
    t.datetime "updated_at"
end

我正在使用 Devise 进行注册,我想添加一个验证来检查“电子邮件域是否存在于 bot 表中”记录是否无效。

验证的方法是这样的:

def is_a_bot?(user_email)
 Bot.where("banned_domains LIKE (?)", "%#{user_email}%").present?
end

如何使用我的用户模型的“电子邮件”属性的这种方法添加验证?

【问题讨论】:

  • 您能否提供一些来自banned_domains 字段的示例值?
  • 例如“stack.ru”
  • 那么该字段不应该称为banned_domain 而不是banned_domains 吗?复数是混乱的。

标签: ruby-on-rails validation devise


【解决方案1】:

将此验证添加到您的用户类

#in User
before_create :check_not_a_bot

def check_not_a_bot
  if Bot.find_by_banned_domains(self.email.split("@").last)
    self.errors.add(:email, "domain exists in list of banned domains")
  end
end

【讨论】:

    【解决方案2】:

    像这样在 Bot 模型中定义方法

    self.is_a_bot?(user_email)
     Bot.where("banned_domains LIKE (?)", "%#{user_email}%").present?
    end
    

    那么在 User 模型中你可以使用 validates 或者 before_create 方法(例如)

    before_create :check_bot_email
    
    def check_bot_email
      if Bot.is_a_bot?(self.email)
        errors.add(:base, "The user is a bot")
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      相关资源
      最近更新 更多