KaQiita

新米エンジニアが適当なことを書いてます。温かく見守ってやってください。

【Rails】after_action に render の処理を書くことはできない

はじめに

先日、一緒に働いてくれているインターン生の子から以下のような質問をもらいました。

それは自分が書いた以下のようなコードに対してです。

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 メソッドをコールバックでまとめることはできませんでした。