今週のRailsCasts - Notifications in Rails 3
Rails 3 から追加された AcriveSupport::Notifications を使って、通知を実装する話。
Railscasts - Notifications in Rails 3
Notifications in Rails 3
Module: ActiveSupport::Notifications
使い方
config/initializers 配下にファイルを作って定義する。
- name
- notificationの名前
- start
- 開始時間
- finish
- 終了時間
- id
- id
- payload
- その他の情報。hash形式
ActiveSupport::Notifications.subscribe do |name, start, finish, id, payload| Rails.logger.debug(["notification:", name, start, finish, id, payload].join(" ")) end
各リクエストの処理時間をDBに入れる例
subscribeに引数を指定すると、notification をフィルタリングできる。
ActiveSupport::Notifications.subscribe "process_action.action_controller" do |name, start, finish, id, payload| PageRequest.create! do |page_request| page_request.path = payload[:path] page_request.page_duration = (finish - start) * 1000 page_request.view_duration = payload[:view_runtime] page_request.db_duration = payload[:db_runtime] end end
既存のlogging処理をnotificationに渡す
モデルにログの処理を書くのは良くないらしい?ログ処理を notification に渡すには下記のようにActiveSupport::Notifications.instrument を使う
class Product < ActiveRecord::Base def self.search(search) if search ActiveSupport::Notifications.instrument("products.search", :search => search) where('name LIKE ?', "%#{search}%") else scoped end end end <|| subscribe側はこう書く。 >|ruby| ActiveSupport::Notifications.subscribe "products.search" do |name, start, finish, id, payload| Rails.logger.debug "SEARCH: #{payload[:search]}" end
注意
notificationはあくまでloggingで使うのがよい。例えばユーザ登録した後でemailを送るような処理はnotificationではやらない方がいい。コードが散在してわかりにくくなる危険がある。