ino-akiのブログ

ITエンジニアを目指して学習したことをアウトプットするブログ

renderとredirect_toの違い

renderとredirect_toは、どちらも実行するとビューが表示される
では、何が違うのかというと表示までの経路が違う

 

redirect_toは、再度コントローラーを経由してビューが表示される

renderは、そのままビューが表示される

これによって、元のインスタンス変数の値が上書きされるかどうかが違ってくる

 

  def create
    @prototype = Prototype.new(prototype_params)
    if @prototype.save
      redirect_to root_path
    else
      render :new, status: :unprocessable_entity
    end
  end

上記の例は、新規投稿ページでフォームの入力が保存された場合は、ルートパスのページに飛び、保存されなかった場合は、新規投稿ページに飛ぶ処理である

 

renderは、そのままビューが表示されるため、元のインスタンス変数の値が上書きされない

つまり、保存されなかった場合は、フォームに入力した内容を保持したままの処理になる

また、多くの場合renderはデータの保存や更新などに失敗した場合に使用される

そのため、発生したエラーを指定して使用する

:unprocessable_entityは、発生したエラーの種類を示すもので、何らかの処理に失敗したという汎用的な指定方法になる

特にエラーの種類を限定したい場合以外は、:unprocessable_entityを使用すると覚えておく

補足

render :newとシンボル型で指定しているが、以下の場合はパスで指定する

views内のディレクトリに複数のshow.html.erbがある場合

render "prototypes/show"のようにパスで指定する