我有以下代码确保没有用户将系统用作垃圾邮件机器人。在模型 ShopInvite 我有这个代码:
before_validation(on: :create) do
!(ShopInvite.where("created_at >= ?", Time.now.ago(60.minutes)).where(:sender_ip => self.sender_ip).count > 2)
end
这可行,但我如何将“由于垃圾邮件保护而未发送”消息显示到视图中?
我有以下代码确保没有用户将系统用作垃圾邮件机器人。在模型 ShopInvite 我有这个代码:
before_validation(on: :create) do
!(ShopInvite.where("created_at >= ?", Time.now.ago(60.minutes)).where(:sender_ip => self.sender_ip).count > 2)
end
这可行,但我如何将“由于垃圾邮件保护而未发送”消息显示到视图中?
只需向您的实例添加一个错误:
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
.
我想这就是你想要的。注意通过自定义方法验证是复数验证
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