はじめに
Rails 6 に追加された新機能を試す第89段。 今回は、 Event object
編です。
Rails 6 では、ActiveSupport::Notifications.subscribe
で、ブロックパラメータを1つにすると、そのブロックパラメータに ActiveSupport::Notifications::Event
オブジェクトが設定されるようになりました。
これで、ブロックの中で ActiveSupport::Notifications::Event.new
を使う必要がなくなりました。
Ruby 2.6.4, Rails 6.0.0 で確認しました。
$ rails --version
Rails 6.0.0
今回は、User の CRUD を作り、各コントローラのアクションを実行したときの情報を取得してログに出力してみます。
プロジェクトを作る
rails new rails_sandbox
cd rails_sandbox
User の CRUD を作る
name をもつ User の CRUD を作ります
bin/rails g scaffold User name
Subscribe する
config/initializers/notification_subscriber.rb
を作成します。
ActiveSupport::Notifications.subscribe
を呼び出すときに、ブロックパラメータを event
1つだけにします。
ActiveSupport::Notifications.subscribe 'process_action.action_controller' do |event|
action = "#{event.payload[:controller]}##{event.payload[:action]}"
Rails.logger.info("#{action} cpu_time=#{event.cpu_time} duration=#{event.duration} allocations=#{event.allocations}")
end
User の登録などをしてログを確認する
実際に rails server
を実行してブラウザから http://localhost:3000/users にアクセスします。
以下のようにコンソールに出力されているはずです。
...
UsersController#index cpu_time=833.013591 duration=840.9244199865498 allocations=1237733
試したソース
試したソースは以下にあります。
https://github.com/suketa/rails_sandbox/tree/try089_subscriber_event