🙆♀️
[Rails]リクエストスコープの変数を作りたい
環境
- 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 ログをスッキリ実装したい
その他
参考にした Qiita に書いてある request_store_rails は最近でも更新があってそっちのがよさそうに見える。
が、しかし。 request_store は大人気(私的見解) gon が依存しているので
ただの request_store で良いだろうと思っている。
Discussion