Как мне создать наблюдателя для модели хранилища игрушек?

#ruby-on-rails #redis #activemodel

#ruby-on-rails #redis #activemodel

Вопрос:

Задана модель:

 class User
  include Toy::Store
  attribute :name
end
  

Могу ли я использовать ActiveModel::Observer для создания observer? Я удаляю фреймворк ActiveRecord, поскольку я не использую его в своем приложении Rails.

Добавление наблюдателя, подобного:

 class UserObserver < ActiveModel::Observer
  def after_save(model)
    puts "Hello!"
  end
end
  

похоже, не работает. Включение observer в конфигурацию приложения не работает, потому что платформа ActiveRecord удалена.

Комментарии:

1. User — это просто прямой класс Ruby для Rails, поэтому я могу видеть, как встроенные наблюдатели не будут работать. Возможно, вам придется написать свой собственный.

Ответ №1:

Я также хотел использовать Observers с Toy::Store. Оказывается, что обычные события жизненного цикла объекта, такие как создание, сохранение, обновление и удаление, которые наблюдаются в Rails, наблюдаемы из-за ActiveRecord. Объекты магазина игрушек являются объектами ActiveModel и не имеют одинаковых перехватов. Я подробно остановился на этой теме в сообщении в блоге о том, почему магазин игрушек не работает с наблюдателями.

Но, хорошая новость, по-прежнему возможно использовать observers с toy store, вам остается только реализовать их. Я также написал сообщение в блоге о том, как использовать Observers с Toy::Store , но суть в следующем: ваш объект Toy, в данном случае User , должен включать ActiveModel::Observing и запускать событие, когда это подходит для этой модели:

 class User
  include Toy::Store
  attribute :name
  after_save :notify_observers_save_occured

  private

  def notify_observers_save_occured
    self.class.notify_observers(:after_save, self)
  end

end
  

Ответ №2:

Вы можете наблюдать только потомков ActiveModel. Они не обязательно должны быть объектами ActiveRecord, хотя, как вы можете прочитать в статье Иегуды Каца: ActiveModel делает любой объект ruby похожим на ActiveRecord