煙と消えるその前に

一服してるうちに忘れる、自分のための備忘録。とかとか

Railsでrender前に共通処理を入れたくて

一覧表示をする際に、ログインユーザに応じて一覧をカスタマイズしたかった。
複数コントローラで同じ処理が必要だったのでafter_actionで実装してみたけど期待通りに動かない!なんでさ!
と思ったら、renderの後にafter_actionが実行されるというオチでした。
で、render前に処理を入れる仕組みないんだっけ?と調べたんだけど、結局自前実装するオチに。

renderをオーバーライド

ぱっと思いついてセルフ却下。
アクション判定しないといけないしイケてないよなーと思ったから。

class IndexCustomizedController < ApplicationController
  def customize
    ...
  end

  def render(*args)
    customize if @_action_name == "index"
    super
  end
end

before_render

あーこれこれ、やっぱりあるよね。
Rails5系の情報が見つからなかったけど参考にできそう。

思いとどまって自前実装

いやでもちょっと待てよ
フレームワークに手を入れてまでやることか...?と思いとどまった。
(AOP的にはrender前もフックポイントと認識されるんだろうか?)
しかもbefore_renderがあると、コードを読むときにその存在を覚えて読まないといけないので*_actionとは違って可読性も落ちそう。
ということで結局moduleを定義することにした。

class MyController < ApplicationController
  def index
    ...
    custom_data = IndexCustomizer.costom(user, data)
    ...
  end

  ...
end