ユースケース
Railsで、複数のコントローラに似たActionがあるときに、それらを1つのModuleに切り出して、共通化することがありますよね。controllers/concerns/xxx_feature.rb のようなファイルに切り出すパターンです。
このとき、対応するビューも共通化したいことがあります。たとえば、showアクションを共通化している場合、こんな感じで自分で指定やれば、もちろんできます。
xxx_feature.rb
def show
...
render "shared/xxx/show"
end
ただ、以下のような点が不満です。
- 面倒。
- あるコントローラでは共通化ビューを使いたい、あるコントローラでは直接コントローラで自前のカスタムビューを使いたいという切り分けをしようとすると、テンプレートの有無を調べたりして煩雑になる。
特に、2については耐え難いと感じて、方法を調べました。
解決方法
バッチリ、エレガントな方法がありました。
xxx_feature.rb
module XxxFeature
extend ActiveSupport:Concern
class_methods do
def local_prefixes
super.push("shared/xxx")
end
end
end
これで、コントローラのパス(controller_path)とコントローラの継承しているクラスの間に、このモジュールに対応するビューのパスを挟み込むことができます。
便利!!