如何从模型中的before_validate向用户发送消息

时间:2013-08-26 00:06:17

标签: ruby-on-rails

我有以下代码,确保没有用户将系统用作垃圾邮件机器人。在ShopInvite模型中,我有这个代码:

  before_validation(on: :create) do
    !(ShopInvite.where("created_at >= ?", Time.now.ago(60.minutes)).where(:sender_ip => self.sender_ip).count > 2)
  end

这有效,但如何在视图中显示“由于垃圾邮件保护而未发送”消息?

2 个答案:

答案 0 :(得分:1)

只需在您的实例中添加错误:

before_validation(on: :create) do
  if (ShopInvite.where("created_at >= ?", Time.now.ago(60.minutes)).where(:sender_ip =>  self.sender_ip).count > 2)
    errors[:base] << 'cannot be sent due to spam protection'
    false
  else
    true
  end
end

然后,正如d_ethier所说,你在实例上调用valid?方法,如果返回false,则在视图上显示错误消息。

虽然这实际上是一种验证,但您应该使用validates代替before_validation执行此操作。

答案 1 :(得分:0)

我认为这就是你想要的。 通过自定义方法验证的复数验证

class ShopInvite < ActiveRecord::Base
  validate :message_to_user

def message_to_user

 if (ShopInvite.where("created_at >= ?", Time.now.ago(60.minutes)).
     where(:sender_ip => self.sender_ip).count > 2)
     errors[:base] << 'cannot be sent due to spam protection'
     false
  else
    true
  end
end
end