やりたいこと
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を表示できないためです。