maeshimaの日記

メモ書きです

今週の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ではやらない方がいい。コードが散在してわかりにくくなる危険がある。