PCやスマートフォン、タブレットなど、ユーザのデバイスの種類に応じてビューファイルを振り分けたい場合があると思います。 このやり方はいくつかありますが、rack-user_agentにより実装する方法について、選定理由や導入手順などを説明します。

選択肢

現在Railsでビューファイルを振り分ける方法として、以下の3つの方法が大きく考えられます。

1. jpmobile

携帯電話に関する総合的なユーティリティ。 携帯向けに実装する場合は非常に有用ですが、単に振り分けだけに導入するのは機能過多だと思います。

2. mobylette

2016年3月現在、3年近くメンテナンスされていません。 今後のRailsの更新にともなって利用できない可能性もありますので、使わない方がいいでしょう。

3. rack-user_agent

後述するActionPack Variantsを用い、シンプルに振り分けを実現できます。 また、wootheeという国際的に信頼されたUAパーサを利用しており、デバイスのキャッチアップが期待できます。

以上の理由より、今回はrack-user_agentを選びました。

ActionPack Variants

Rails 4.1.0よりActionPack Variantsが導入されました。 これは、request.variantにデバイスの種類をセットすると、それに対応するビューファイルに振り分けてくれる、というものです。

rack-user_agentは、wootheeを用いてユーザのデバイスをパースし、それを request.device_variant により取得できます。 つまり、これをアプリケーション側で request.variant にセットするだけで、振り分けを行なえるようになります。

実装方法

1. インストールする

Gemfileに以下を追加して、bundle installします。

gem 'rack-user_agent'

2. コントローラを実装する

コントローラで request.variant にユーザのデバイスの種類をセットします。

app/controllers/application_controller.rb:

class ApplicationController < ActionController::Base
  before_action :set_request_variant

  private

  def set_request_variant
    request.variant = request.device_variant
  end
end

3. ビューファイルを作成する

あとは、デバイスに応じたビューファイルを作成するだけです。 たとえばPC向けのビューファイルであれば index.html+pc.erb 、スマートフォン向けであれば index.html+smartphone.erb となります。

その他のメソッド

その他、ビュー内で使える request.from_pc? といったヘルパなども用意されています。 詳しくはREADMEをお読みください。