Статистика, уведомление и триггеры в Ruby on Rails
Передо мной стоит задача реализовать сбор статистики использования приложения на Ruby On Rails. Для этого подходит шаблон Observer, наблюдатель. В общем виде он применяется когда есть следующая задача:
Один объект («Подписчик») должен знать об изменении состояний или некоторых событиях другого объекта. При этом необходимо поддерживать низкий уровень связывания с объектом — «Подписчиком».
Для того, чтобы он работал, нужно, чтобы приложение давало возможность подписчику зарегистрировать себя, а подписчик должен релизовывать некоторый общий интерфейс, понятный приложению, через который он будет получать сообщения об изменении состояний.
Я приведу задачу из плугина restful_authentication, который наверное всем знаком. Он используется для реализации системы аутентитификации. Допустим, у меня есть класс User. Я хочу чтобы после того, как объект этого класса получил сообщение create, пользователю было отправлено сообщение на email с помощью UserMailer.deliver_signup_notification(user) (мы не будем разбираться с этим классом, примите как данное, что он хорошо работает и умеет отсылать письма). Так как работа с почтой и уведомлениями не является основной задачей класса User, то стоит создать наблюдателя, который бы справлялся с этой задачей.
В Rails наблюдателей можно сделать вообщем двумя способами: коротким и длинным. Сначала — длинный:
class UserObserver < ActiveRecord::Observer
def after_create(user)
UserMailer.deliver_signup_notification(user)
end
end
Мы создаем observer для класса User. Поэтому обязательно имя класса будет UserObserver. Он должен наследовать от Observer (ссылка на описание в Ror API). Чтобы он обрабатывал сообщение User#create мы описываем метод after_create, принимающий в качестве аргумента объект, за которым наблюдатель собственно наблюдает.
Сохраните этот код в файл app/models/user_observer.rb.
Чтобы Observer заработал его нужно зарегистрировать. Для этого в файле config/environment.rb вашего Rails приложения добавьте такую строку (если её еще нету):
config.active_record.observers = :user_observer
Это все, что касается долгого пути. А теперь короткий:
В консоли напишите
>ruby script/generate Observer User
Это сгенерирует файл app/models/user_observer.rb, и занесет в config/environment.rb ту самую верхнюю строку. В app/models/user_observer.rb будет находиться
class UserObserver < ActiveRecord::Observer
end
А вы дополните её своим кодом. Таким вот простым образом мы можем обрабатывать любые события, происходящими с нашими моделями в Ror приложении.
За подробной информацией обращайтесь сюда api.rubyonrails.org, citforum.ru.
Read Full Post | Make a Comment ( 1 so far )