2013-08-26 2 views
0

У меня есть следующий код, который гарантирует, что ни один пользователь не использует систему как спам-бот. В модели ShopInvite у меня есть этот код:Как получить сообщение от пользователя before_validate в модели

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

Это работает, но как я получаю сообщение «Не посылать из-за защиты от спама» в поле зрения?

+0

Вы можете разместить свой код контроллера, который зависит от этой проверки? Вы можете использовать метод 'valid?' В экземпляре объекта (в контроллере), чтобы передать сообщение в представление. –

ответ

0

Просто добавьте ошибку в экземпляр:

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? метод на экземпляре, и если она возвращает ложь вы показать сообщение об ошибке на представлении.

Хотя это на самом деле своего рода проверка, поэтому вы должны, вероятно, сделать это с помощью validates вместо before_validation.

+0

Обратите внимание, что, как и любой обратный вызов 'before', он прекратит выполнение, если и только если он возвращает false. Таким образом, это определение функционально отличается от оригинала, возвращая что-то «не-ложное» во всех случаях. –

+0

Спасибо, только что отредактирован, чтобы вернуть значение false. – pcarranzav

0

Я думаю, что это то, что вы хотите. Becareful что проверить с помощью пользовательского метода является множественным Validate

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 
Смежные вопросы