renderとredirect_to

やりたいこと

renderとredirect_toについて理解したい。


Controller

controller

def new
  @board = Board.new
end

def create
  @board = Board.new(board_params)
  
  respond_to do |format|
    if @board.save
      format.html { redirect_to @board, notice: 'Success' }
   else
      format.html { render: new }
  end
end

private

def board_params
  params.require(:board).permit(:title, :body)
end



renderについて

format.html { render: new }

もし、入力された値の保存に失敗した場合はviewのnew.html.erbに遷移するという意味です。

ここで注意する事がnewアクションに行くわけではないという事です。つまり以下のnewアクションを介さないという事です。

def new
  @board = Board.new
end

じゃあ変数はどこで定義されたものを使っているのでしょうか?それはcreateアクションの@boardです。なのでcreateアクションの@boardがnewアクションを介さずにnew.html.erbに移動します。



redirect_toについて

 format.html { redirect_to @board, notice: 'Success' }

redirect_toは保存に成功した時にnewアクションの@boardを介します。なので@board = Board.newによりredirect_toされた後は入力された値が一旦リセットされます。



エラー文を表示したいとき

エラー文の表示はcreateアクション内の@boardに対してつけられるものです。 ここでrenderの部分をredirect_toとするとエラーメッセージ はどうなるでしょうか?

   else
      format.html { redirect_to new_board_path }
  end

renderの部分をredirect_toに変更してしまうとエラー文が表示されなくなります。これはredirect_toでnewアクション内の@boardを介してしまいエラー文が記載されるcreateアクション内の@boardを表示できないためです。