Rails4.1から導入されたActionPack Variantsを使ってviewを切り分ける


自分で実験的に作っているサイトでデバイス毎にviewを切り分けたいなと思い、以前軽く試したActionPack Variantsを使ってみたので、忘れ無いようにメモを残す

ActionPack Variantsでviewを切り分ける流れ

ざっくりと流れをいうと
1. uaを見てどのデバイスからのアクセスか判定する
2. 判定して例えばtabletだとしたら、request.variant = :tabletをセット
3. render処理で「app/views/hogehoge/**.html+tablet.slim」の中身をレンダリングする

今回使った方法

ua判定

上記の流れの通りなのだが、1のua判定のところをどうしようかなぁって思っていたら、別の方がbrowserというgemを使ってやっていたので、そのgemを使うことにした。
これを使うと例えば、

request.variant = : tablet if browser.device.tablet?

みたいな実装ができるので、これを使うことにした。

コード例

hoges_controller.rb

class HogesController  < ApplicationController
  before_action :set_request_variant

  private

  def set_request_variant
     request.variant = :tablet if browser.device.tablet?
     request.variant = :android if browser.platform.android?
  end

end
index.html+tablet.slim
| tablet端末だよ
index.html+android.slim
| Android端末だよ

こんな感じのコードになります。
実際は多分ua判定のロジックはconcernに切り出すか、親クラスに書いてやるのが良いかと思います。
今回はconcernに切り出したりしました。