Статистика, уведомление и триггеры в Ruby on Rails

Posted on Май 18, 2008. Filed under: coding, ruby | Метки: , , |

Передо мной стоит задача реализовать сбор статистики использования приложения на 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.

Реклама
Читать запись полностью | Make a Comment ( 1 so far )

Liked it here?
Why not try sites on the blogroll...