我有以下代码,确保没有用户将系统用作垃圾邮件机器人。在ShopInvite模型中,我有这个代码:
before_validation(on: :create) do
!(ShopInvite.where("created_at >= ?", Time.now.ago(60.minutes)).where(:sender_ip => self.sender_ip).count > 2)
end
这有效,但如何在视图中显示“由于垃圾邮件保护而未发送”消息?
答案 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