サブドメイン名等で、描画するテンプレートを上手いこと分けるためのGem、template-switcherを作った

仕事で、サブドメインドメインごとに、レンダリングするテンプレートを切り替えたい事があり、せっかくなので、Gemにしてみた。
既にどっかにありそうな感じが凄くするのだが、パっとググってもgemは見つからなかった。
最近、こんな感じの非常にしょぼいGemを作るのが趣味になってきた気がする。


GitHub - joker1007/template-switcher: Rails template switcher.


中身は、initializerで定義しておいたpathのマッピングに合わせて、prepend_view_pathしているだけ。
マッピングの定義やテンプレートの用意が無ければ、普通にapp/viewsの下を見にいくので、基本的には共通のテンプレを使いつつ、特定の処理だけテンプレごと差し替えたい、という時に使う・・・のかな?


initializerでこんな感じに書いておいて、

TemplateSwitcher.mapping = {
  "abc.example.domain" => "abc_views",
  "xyz.example.domain" => "xyz_views",
}


controllerでモジュールをincludeする

class PostsController < ApplicationController
  include TemplateSwitcher::AutoRenderSwitcher

  def index
    render "index"
  end

  private
  def template_selector
    request.host
  end
end


そうすれば、renderのタイミングで勝手に、app/abc_viewsとか見にいってくれる。


今回、gemの中身はさておき、テストをどうやって書くのかで、非常に勉強になった。
deviseとkaminariを参考に、フェイクのRailsアプリを作り、rspec-railsが用意しているコントローラーテスト向けの拡張を手動でインクルードして、
という感じで、テスト環境の構築の方が実装の倍ぐらい時間かかった。