読者です 読者をやめる 読者になる 読者になる

Rails で動的配信するアクションを宣言的に指定する

やりたかったこと

  • UserAgent に応じて動的配信したい
    • PC だったら通常の "#{action_name}.html.erb" を render したい
    • スマホだったら "mobile_#{action_name}.html.erb" を render したい
  • 動的配信するアクションを宣言的に指定するだけで render する view を振り分けたい

実装

動的に Module を生成して prepend することで実現できました。

 class PostsController < ApplicationController
+  prepend DynamicServing(:index, :show)
+
   def index
   end

   def create
   end
class ApplicationController < ActionController::Base
+  class << self
+    def DynamicServing(*actions)
+      Module.new do
+        actions.each do |action|
+          define_method action do
+            super()
+            render "mobile_#{action_name}" if browser.device.mobile?
+          end
+        end
+      end
+    end
+  end

UserAgent の判定には fnando/browser を使っています。

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

  • 作者: Rubyサポーターズ,すがわらまさのり,寺田玄太郎,三村益隆,近藤宇智朗,橋立友宏,関口亮一
  • 出版社/メーカー: 技術評論社
  • 発売日: 2013/08/10
  • メディア: 大型本
  • この商品を含むブログ (22件) を見る