#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