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"のようにパスで指定する