1

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

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

这可行,但我如何将“由于垃圾邮件保护而未发送”消息显示到视图中?

4

2 回答 2

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.

于 2013-08-26T01:34:07.907 回答
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
于 2013-08-26T03:43:20.877 回答