Псевдоним метода цепочки с методом не определен
У меня есть модуль, который включается в Rails Observer.
Целью является:
- Позвони на
after_save
а такжеafter_update
метод с именемcheck_integrity
- Вызов
check_integrity
в концеafter_save
и / илиafter_update
если определено в Обозревателе.
Короче так всегда надо звонить check_integrity
,
Я попробовал что-то похожее на следующий код:
module IntegrityObserver
extend ActiveSupport::Concern
included do
alias_method_chain :after_save, :check_integrity
alias_method_chain :after_update, :check_integrity
end
def check_integrity
# do something
end
end
class UserObserver < ActiveRecord::Observer
include IntegrityObserver
def after_save(object)
# do something
end
end
Но это вызывает ошибку: activesupport-3.0.17/lib/active_support/core_ext/module/aliasing.rb:31:in alias_method': undefined method after_update' for class TaskObserver' (NameError)
У кого-то есть идеи, как я могу делать то, что хочу?
Спасибо!
3 ответа
ActiveRecord уже предоставляет функции наблюдателя для мониторинга жизненного цикла ваших моделей. Вот как вы можете зарегистрировать универсального наблюдателя, который отвечает более чем на одну модель:
class AuditObserver < ActiveRecord::Observer
observe :account, :balance
def after_update(record)
AuditTrail.new(record, "UPDATED")
end
end
В вашем файле config/application.rb:
config.active_record.observers = :audit_observer
Проверьте больше примеров здесь.
alias_method_chain не работает таким образом. Если вы определите что-то вроде:
alias_method_chain :after_save, :check_integrity
вам нужно определить следующий метод:
def after_save_with_check_integrity(*args)
# do something
# you can call the original after_save by calling:
# after_save_without_check_integrity(*args)
end
просто знайте, что использование alias_method_chain в большинстве случаев считается плохой практикой.
В отличие от моделей, у наблюдателей нет предопределенных методов обратного вызова, таких как after_save, after_update. Итак, вы получили ошибку "неопределенный метод".
Вы можете сделать это так,
module IntegrityObserver
extend ActiveSupport::Concern
def after_save(record)
check_integrity
end
def after_update(record)
check_integrity
end
def check_integrity
# do something
end
end