74
76

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RailsでUserAgentの情報を取得して簡単に扱いたい

Last updated at Posted at 2017-01-10

リクエストパラメータから直接取得する場合

application_controller.rbで以下のようなコードを書くと
全てのリクエストヘッダをログの表示させることができます。

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を使ってブラウザかモバイルか判別する

Gemfile
gem 'browser'

Safariの判定

if browser.safari?

モバイル判定

if browser.device.mobile?

こめんと

request.env["HTTP_USER_AGENT"]でリクエストパラメータから直接ユーザーエージェントを取得し、ブラウザやモバイル端末の判別をしたい場合は、
上記に示したようにゴニョゴニョとコードを書かないといけません。
めんどくさい。
そんなめんどくさいことをしなくてもUserAgent情報を取得して
取り出したい情報だけをシュッと取り出せるメソッドを持つ便利なgemがあります!

👇👇👇👇👇👇👇👇

Woothee

Wootheeを使ったユーザーエージェントの判別方法。
Wootheeとは、多言語対応UserAgentのパーサライブラリです。

gemインストール

Gemfile
gem 'woothee'
bundle install

ログでwootheeを確認

application_controller.rb
# 全てのリクエストヘッダをログの表示させる
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でモバイル端末の判別

スマホかどうか判定したい場合、

application_controller.rb
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インストール

Gemfile
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を作った

参考になったこれらのgemの使い方

74
76
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
74
76

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?