リクエストパラメータから直接取得する場合
application_controller.rb
で以下のようなコードを書くと
全てのリクエストヘッダをログの表示させることができます。
# 全てのリクエストヘッダをログの表示させる
request.headers.sort.map { |k, v| logger.info "#{k}:#{v}" }
そのログの中にHTTP_USER_AGENT
を見つけることができます。
.
.
HTTP_USER_AGENT:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36
.
.
以下のコードでHTTP_USER_AGENT
を取得することができます。
request.env["HTTP_USER_AGENT"]
# => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"
ちなみに、以下の二つは同義。
request.user_agent
request.headers["HTTP_USER_AGENT"]
どのブラウザからのアクセスか判別する
# ユーザエージェントより、どのブラウザよりアクセスかを特定
def ua
ua = request.env['HTTP_USER_AGENT']
if ua.include? "MSIE"
@browser = "ie"
elsif ua.include? "Firefox"
@browser = "firefox"
elsif ua.include? "Chrome"
@browser = "chrome"
elsif ua.include? "Opera"
@browser = "opera"
elsif ua.include? "safari"
@browser = "safari"
else
@browser = "others"
end
render :text => @browser
end
どのモバイル端末か判別する
どのモバイル端末か判別して、リダイレクトさせる。
iPhone/iPad/iPod Touch には全て ‘Mobile’ という文字列
Android端末には ‘Android’ の文字列がユーザーエージェントに含まれています。
before_filter :check_user_agent_for_mobile
def check_user_agent_for_mobile
ua = request.env["HTTP_USER_AGENT"]
if(ua.include?('Mobile') || ua.include?('Android'))
redirect_to :controller => "mobile", :action => "index"
end
end
備考
gemを使ってブラウザかモバイルか判別する
gem 'browser'
Safariの判定
if browser.safari?
モバイル判定
if browser.device.mobile?
こめんと
request.env["HTTP_USER_AGENT"]
でリクエストパラメータから直接ユーザーエージェントを取得し、ブラウザやモバイル端末の判別をしたい場合は、
上記に示したようにゴニョゴニョとコードを書かないといけません。
めんどくさい。
そんなめんどくさいことをしなくてもUserAgent情報を取得して
取り出したい情報だけをシュッと取り出せるメソッドを持つ便利なgemがあります!
👇👇👇👇👇👇👇👇
Woothee
Wootheeを使ったユーザーエージェントの判別方法。
Wootheeとは、多言語対応UserAgentのパーサライブラリです。
gemインストール
gem 'woothee'
bundle install
ログでwootheeを確認
# 全てのリクエストヘッダをログの表示させる
request.headers.sort.map { |k, v| logger.info "#{k}:#{v}" }
そのログの中にrack.woothee
を見つけることができます。
rack.woothee:{:name=>"Chrome", :category=>:pc, :os=>"Mac OSX", :os_version=>"10.12.2", :version=>"55.0.2883.95", :vendor=>"Google"}
wootheeでモバイル端末の判別
スマホかどうか判定したい場合、
def request_from_smartphone?
Woothee.parse(request.user_agent)[:category] == :smartphone
end
みたいなのを書きます。
でも、、、
最初からこんな風にfrom_smartphone?
みたいに書ける、
さらに便利なgemがあります!
request.from_smartphone?
👇👇👇👇👇👇👇👇
rack-user_agent
Wootheeを使ってRack middlewareでUser-Agentがパースされ、
その結果に応じてrequestから簡単にいろいろな情報を得ることができます。
github: https://github.com/k0kubun/rack-user_agent
gemインストール
gem 'rack-user_agent'
bundle install
実装
request.env["HTTP_USER_AGENT"] #=> "Mozilla/5.0 (Macintosh; ..."
# request.env["HTTP_USER_AGENT"]とrequest.user_agentは同じ
request.user_agent #=> "Mozilla/5.0 (Macintosh; ..."
request.device_type #=> pc
request.os #=> "Mac OSX"
request.browser #=> "Chrome"
request.from_pc? #=> true
request.from_smartphone? #=> false
こんな感じでrequestから情報を簡単に取得できるので便利。
モバイルかpcか、スマホかタブレットか、などなどの判別がしやすいです。
多いのは、デバイスの種類などによってレイアウトを切り替えたりしたい人は多いはず。
それ以外でも色々使い道はありそうです。
こちら、わかりやすい実装例でした。
RailsでUserAgentに応じてlayoutを切り替える
こちらrack-user_agentのgemを作成されたk0kubunさんの記事です。
Railsでデバイスの判定をするのに便利なgemを作った