このエントリーをはてなブックマークに追加
2013-07-31 00:00:00 +0900

モデルのレコードを作ったクライアントの情報を保存したい場合など,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']



記事一覧へ