2015-01-20 8 views
2

Я хочу, чтобы проверить некоторые атрибуты новой записи, и если некоторое условие истинно, предотвращают объект от создания:рельсов предотвратить создание объекта в before_create обратного вызова

before_create :check_if_exists 

def check_if_exists 
    if condition 
    #logic for not creating the object here 
    end 
end 

Я также открыт для лучшего решения!

Мне нужно это для предотвращения повторных вызовов API.

Благодаря

+0

ты прикасаешься Callbacks ад. Следующий шаг: вы удалите их из своих моделей и отбросьте эти поведения в служебных объектах – apneadiving

ответ

4

Вы также можете использовать валидатор уникальности ... на самом деле это лучший подход, поскольку они предназначены для этих ситуаций.

Другое дело с обратным вызовом является то, что вы должны быть уверены в том, что она возвращает true (или truthy значение), если все в порядке, потому что, если обратный вызов возвращает false или nil, она не будет сохранена (и если ваш if состояние оценивается как false и ничего не запускается после того, как вы написали, как, например, ваш метод вернет nil вызывая ваши записи не сохраняются)

The docs и The guide

+0

Я хочу проверить уникальность post.body в рамках обсуждения, где он создается. Как вы думаете, это возможно? –

+1

'validates: body, uniqueicity: {scope:: discussion_id}', вероятно, вы ищете. Со старым синтаксисом хэша: 'validates: body,: uniqueness => {: scope =>: discussion_id}' – Fer

+0

, кажется, работает отлично, спасибо большое! –

7
before_create :check_if_exists 

def check_if_exists 
    errors[:base] << "Add your validation message here" 
    return false if condition_fails 
end 

Лучше подход:

Вместо выбора обратных вызовов, вы должны рассмотреть вопрос об использовании проверки here.Validation, безусловно, предотвратить создание объекта, если условие не выполняется. Надеюсь, поможет.

validate :save_object? 
    private: 
    def save_object? 
    unless condition_satisifed 
     errors[:attribute] << "Your validation message here" 
     return false 
    end 
    end 
+0

спасибо! валидации лучше, чем обратный вызов в этом случае, определенно! upvote –

Смежные вопросы