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