モデルのレコードを作ったクライアントの情報を保存したい場合など,modelからrequest変数の中身が使いたいときがある. たとえば,クライアントのIPアドレスやUser-Agentを保存したい場合など,結構そういう場面がある. 以下,request変数(通常はコントローラからしか触れない.)をモデルから使いたい場合のやり方.
class ApplicationController < ActionController::Base (省略) before_filter :set_request_filter def set_request_filter Thread.current[:request] = request end end
モデル内で,
request = Thread.current[:request]
として取得できる.
以下のようなやり方も情報としては見かけるが,グローバルに設定してしまうのはちょっと不安である.webrickなら大丈夫そうだけど,マルチスレッドで動作するサーバ上では不安ですね.
class ApplicationController < ActionController::Base (省略) before_filter :set_request_filter def set_request_filter $request = request end end
requestの中に何があるかはこの辺 http://railsdoc.com/references/request
クライアントやリクエストを取得する例としては,たとえば以下のようにして取得できます.
IPアドレス
request.remote_ip
リファラ
request.env['HTTP_REFERER']
ユーザエージェント
request.env['HTTP_USER_AGENT']