はじめに
先日、一緒に働いてくれているインターン生の子から以下のような質問をもらいました。
それは自分が書いた以下のようなコードに対してです。
class HogeController < ApplicationController def new @hoge = Hoge.new render 'form' end def edit @hoge = Hoge.find(params[:id]) render 'form' end ・ ・ ・ end
このように異なるアクションで同じ view を render したいときに、after_action
で処理をまとめることはできないのか、という質問です。
具体的には、「以下のように書けないのか」という質問でした。
class HogeController < ApplicationController after_action :render_form, only: %i[new edit] def new @hoge = Hoge.new end def edit @hoge = Hoge.find(params[:id]) end ・ ・ ・ private def render_form render 'form' end end
after_action に render の処理を書くことはできない
結論から言うと、上記のような書き換えはできません。
new アクションや edit アクションの view ファイルが存在するなら、アクションが読まれた時点で respoonse_body に値が入るので、DoubleRenderError になります。
new アクションや edit アクションの view ファイルが存在しない場合も、アクションが読まれた時点で UnknownFormat が吐かれます。
よって、render
メソッドをコールバックでまとめることはできませんでした。