はじめに
Rails 6 に追加されそうな新機能を試す第68段。 今回は、 CurrentAttributes.before_reset
編です。
Rails 6 では、 CurrentAttributes
に before_reset
コールバックが追加されました。
reset される前に呼ばれます。
また、 reset
コールバックの別名として after_reset
が追加されています。
Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は gem install rails --prerelease
でインストールできます。
(Rails 6.0.0 がリリースされましたが、動作確認した時点での最新は、 Rails 6.0.0.rc1でした。悪しからず )
$ rails --version
Rails 6.0.0.rc1
ちょっと適切な例を思いつかなかったので、 User Agent の情報をログに出力するために、 before_reset
を無理矢理、使ってみます。
プロジェクトを作る
rails new rails6_0_0rc1
cd rails6_0_0rc1
User の CRUD を作る
User の CRUD を作ります。
bin/rails g scaffold User name
CurrentAttributes の派生クラスを作る
user_agent
属性を追加して before_reset
でログに、 User Agent の情報を出力するようにします。
class Current < ActiveSupport::CurrentAttributes
attribute :user_agent
before_reset { log_user_agent }
private
def log_user_agent
Rails.logger.info("#{Thread.current}: user_agent = #{Current.user_agent}")
end
end
CurrentRequest を作る
ApplicationController
でインクルードするためのモジュールを作ります。
module CurrentRequest
extend ActiveSupport::Concern
included do
before_action do
Current.user_agent = request.user_agent
end
end
end
ApplicationController を修正する
ApplicationController
で CurrentRequest
をインクルードします。
class ApplicationController < ActionController::Base
include CurrentRequest
end
動作確認する
rails server
を起動してから、ブラウザで http://localhost:3000/users にアクセスしてみます。
ログに User Agent の情報が表示されることがわかります。
...
#<Thread:0x0000556a86f33bd0@puma 004@/usr/local/bundle/gems/puma-3.12.1/lib/puma/thread_pool.rb:89 run>: user_agent = Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36
試したソース
試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try068_current_attribute_before_reset