2013-05-29 2 views
2

Возможно ли установить системный обратный вызов валидации?System wide Validation Callback

Я хочу написать регистратор для каждого сбоя проверки, который возникает в любой модели. Этот обратный вызов не должен изменять поведение любого другого обратного вызова, установленного в моделях.

Мне нужно, чтобы обеспечить более быструю поддержку моих клиентов, моя идея - зарегистрировать все ошибки проверки, чтобы команда поддержки могла узнать, что происходит быстрее.

ответ

4

Хотя @ ответ MurifoX в может работать с некоторой конфигурации, я предпочитаю, чтобы избежать наследования от ActiveRecord :: Base, когда это возможно. Поскольку SuperModel наследуется от ActiveRecord :: Base, он может выглядеть как фактическая модель, которая имеет представление в стороне базы данных, тогда как она существует только для того, чтобы быть унаследованной.

На мой взгляд, лучшим решением вашей проблемы будет Ruby Mixins:

# lib/validation_logger.rb 
module ValidationLogger 
    def self.included(base) 
    base.class_eval do 
     after_validation :log_validation 
    end 
    end 

    def log_validation 
    #custom log here 
    end 
end 

Теперь вы должны просто include ValidationLogger в моделях вы хотели бы войти.

+0

Да, ваш ответ немного более изящный. Хотя оба они работают на практике. =] – MurifoX

+0

Спасибо :) Как я уже сказал, ваш ответ будет работать отлично, но я предпочитаю избегать наследования с ActiveRecord :: Base, когда это возможно. –

0

Возможно, все ваши модели наследуются от одной общей супермодели, которая наследуется от ActiveRecord::Base.

def FirstModel < SuperModel 
end 

def SecondModel < SuperModel 
end 

def ThirdModel < SuperModel 
end 

И потом, вы кладете обратный вызов на супер-модели:

def SuperModel < ActiveRecord::Base 
    after_validation :do_your_thing 

    def do_your_thing 
    # stuff 
    end 
end