🙆‍♀️

[Rails]リクエストスコープの変数を作りたい

2021/08/11に公開

環境

  • Rails 4.2.6
  • Ruby 2.2.4
  • request_scope 1.3.1

どんな用途?

以下のような場合に有用です。

  • IP アドレスをログに出したりしたい
  • Model からセッションに入っているユーザー情報を参照したい

How To

  • gem 'request_store' を Gemfile に追加
  • bundle install
  • application_controller.rb に before_filter を追記
  • どこからでも RequestStore.fetch() で 3 でセットした内容を使用可能

コード例

上記手順の 3 で追記するコードは以下の通り

application_controller.rb
class ApplicationController < ActionController::Base
  before_filter :set_request_store
  def set_request_store
    RequestStore.store[:request] = request
  end
end

セットしたものを使いたい場合のコード

hoge_model.rb
RequestStore.fetch(:request) { nil }
RequestStore.fetch(:request) # 取得できないと no block given エラー
  • 後ろについている { nil } は指定した値が取得できなかった(セットされていない)場合に実行されるブロック。
  • 取得できなかった場合はブロックの返り値が返される(例だと、取得できなかった場合は nil)
  • ブロックを書かずに取得出来なかった場合は no block given (yield) エラー
  • 取得できた場合は、ブロックが無くても普通に動く

参考

リクエスト単位でグローバルな参照を持たせて Audit ログをスッキリ実装したい

http://qiita.com/ainame/items/823b396d560d82194d48

その他

参考にした Qiita に書いてある request_store_rails は最近でも更新があってそっちのがよさそうに見える。

が、しかし。  request_store は大人気(私的見解) gon が依存しているので

ただの request_store で良いだろうと思っている。

Discussion