Псевдоним метода цепочки с методом не определен

У меня есть модуль, который включается в 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
Другие вопросы по тегам