

スマホからアクセスした時にスマホ用にビューを切り替えたいのですが、やり方がわかりません。

`post/edit.html.erb`  
↓  
`post/sp_edit.html.erb`

このように接頭語を付与する形が理想です。  
スマホ用のビューがなかったら通常のビューファイルを使うということができれば完璧です。

どこにどのように記述するのがよろしいでしょうか。


CC BY-SA 3.0
2015-04-20T05:06:38.270
9335
2015-04-22T18:34:19.093
9149
question
ruby-on-rails
railsでviewファイルを動的に切り替えたい


  1. ActionPack Variantsを使う  
Controllerのbefore_actionでrequest.variantをセットしてください。  
メリット：RoRのフレームワーク機能なので導入で揉めることが少ないです。  
デメリット：ファイル名規則が綺麗とはいえません。それから階層的な探索する(ファイルが無ければより大枠での別viewを探す)ことも後述のjpmobileと比べて細かくありません。

  2. jpmobileを使う  
Controllerにinclude Jpmobile::ViewSelectorをセットしてください。  
メリット：gemの中で勝手にやってくれるので分岐意識が不要になります。  
デメリット：sp_edit.html.erbという命名規則が実現できないぐらいです。

  3. 自分でラッパーなりを書く  
1つ1つヘルパーなり何なりをシコシコと書くしかないので割愛します。  
メリット：sp_edit.html.erbの命名規則は間違いなく担保できる  
デメリット：partialみたいに明示的に書くならいいのでしょうが。controllerのrenderみたいに省略されている場合などもアレコレと各必要があって、私は保守の観点からお勧めできません。

個人的には「スマホ用のビューがなかったら通常のビューファイルを使うということができれば完璧」という点を考えてもjpmobileの使用をオススメします。  
jpmobileが採用しにくい理由があれば。それを質問文に追記してください。


CC BY-SA 3.0
2015-04-20T05:47:43.320
9337
2015-04-20T05:47:43.320
8335
9335
answer


Rails 4.1以降であれば、[Action Pack
Variants](http://guides.rubyonrails.org/4_1_release_notes.html#action-pack-
variants)を使うといいと思います。

コントローラで`request.variant`を設定します。

`app/controllers/foos_controller.rb`  

[code]

    class FoosController < ApplicationController
      before_action :set_variant, only: [:show, :edit, :update, :destroy]
    
      def set_variant
        if smart_phone?
          request.variant = :sp
        end
      end
    
[/code]

スマホ用のviewでは`html+sp.erb`のように`request.variant`に指定した名前を`+`でつけます。

例: `app/views/foos/edit.html+sp.erb`

設定したvariant用のviewがない場合は、variantなしのviewがrenderされます。


CC BY-SA 3.0
2015-04-22T18:34:19.093
9479
2015-04-22T18:34:19.093
2599
9335
answer