LoginSignup
1
0

More than 3 years have passed since last update.

Rails6 のちょい足しな新機能を試す68(CurrentAttributes.before_reset 編)

Posted at

はじめに

Rails 6 に追加されそうな新機能を試す第68段。 今回は、 CurrentAttributes.before_reset 編です。
Rails 6 では、 CurrentAttributesbefore_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でした。悪しからず :bow:)

$ 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 の情報を出力するようにします。

app/models/current.rb
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 でインクルードするためのモジュールを作ります。

app/controllers/concerns/current_request.rb
module CurrentRequest
  extend ActiveSupport::Concern
  included do
    before_action do
      Current.user_agent = request.user_agent
    end
  end
end

ApplicationController を修正する

ApplicationControllerCurrentRequest をインクルードします。

app/controllers/application_controller.rb
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

参考情報

1
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0