Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

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

http://codenote.net/ruby/908.html

備考

gemを使ってブラウザかモバイルか判別する

Gemfile
gem 'browser'

Safariの判定

if browser.safari?

モバイル判定

if browser.device.mobile?

http://hyottokoaloha.hatenablog.com/entry/2016/05/04/133503

こめんと

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の使い方

reeenapi
ex-CTO @ Flamingo, Inc.
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away