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

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

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

```ruby:application_controller.rb
# 全てのリクエストヘッダをログの表示させる
request.headers.sort.map { |k, v| logger.info "#{k}:#{v}" }
```

そのログの中に`HTTP_USER_AGENT`を見つけることができます。

```terminal
.
.
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`を取得することができます。

```ruby
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"
```

ちなみに、以下の二つは同義。

```ruby
request.user_agent

request.headers["HTTP_USER_AGENT"]
```

## どのブラウザからのアクセスか判別する

```ruby
 # ユーザエージェントより、どのブラウザよりアクセスかを特定
  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’ の文字列がユーザーエージェントに含まれています。

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

```ruby:Gemfile
gem 'browser'
```

Safariの判定

```ruby
if browser.safari?
```

モバイル判定

```ruby
if browser.device.mobile?
```

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

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

👇👇👇👇👇👇👇👇

# Woothee

[Woothee](https://github.com/woothee/woothee-ruby)を使ったユーザーエージェントの判別方法。
Wootheeとは、多言語対応UserAgentのパーサライブラリです。

### gemインストール

```ruby:Gemfile
gem 'woothee'
```

```
bundle install
```

### ログでwootheeを確認

```ruby:application_controller.rb
# 全てのリクエストヘッダをログの表示させる
request.headers.sort.map { |k, v| logger.info "#{k}:#{v}" }
```

そのログの中に`rack.woothee`を見つけることができます。

```terminal
rack.woothee:{:name=>"Chrome", :category=>:pc, :os=>"Mac OSX", :os_version=>"10.12.2", :version=>"55.0.2883.95", :vendor=>"Google"}
```

### wootheeでモバイル端末の判別
スマホかどうか判定したい場合、

```ruby:application_controller.rb
def request_from_smartphone?
  Woothee.parse(request.user_agent)[:category] == :smartphone
end
```
みたいなのを書きます。

でも、、、
最初からこんな風に`from_smartphone?`みたいに書ける、
さらに便利なgemがあります！

```ruby
request.from_smartphone?
```

👇👇👇👇👇👇👇👇

# rack-user_agent
Wootheeを使ってRack middlewareでUser-Agentがパースされ、
その結果に応じてrequestから簡単にいろいろな情報を得ることができます。

github: https://github.com/k0kubun/rack-user_agent

### gemインストール

```ruby:Gemfile
gem 'rack-user_agent'
```

```
bundle install
```

### 実装

```ruby
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を切り替える](http://qiita.com/coa00@github/items/93edf36d2440eacd2ced)

こちらrack-user_agentのgemを作成されたk0kubunさんの記事です。
[Railsでデバイスの判定をするのに便利なgemを作った](http://k0kubun.hatenablog.com/entry/2014/11/21/041949)


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

- [デスクトップ/スマートフォン のテンプレート出し分け](http://qiita.com/mokokko/items/65db3a77994634141bd3#-%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%B3-%E3%81%AE%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E5%87%BA%E3%81%97%E5%88%86%E3%81%91)