/cats/new
のフォームへの入力内容になんらかのバリデーションエラーなどがあり、@cat.save
に失敗すると、(scaffold状態のRailsアプリなら)入力内容が保持された状態でフォームが表示されます。
よくよく考えると「どんなすごい仕組みで入力内容が保持されているのだろう?」となったのですが。
# app/controllers/cats_controller.rb def create @cat = Cat.new(cat_params) if @cat.save redirect_to @cat, notice: "Cat was successfully created." else render :new, status: :unprocessable_entity end end
@cat = Cat.new(cat_params)
でインスタンス変数にセットされたCat
のオブジェクト(誤った入力内容が各属性にセットされている)が、render :new
で呼び出されるnew
テンプレートに渡されるから、というとてつもなく基本的なことを意識できていなかったのでした。
そもそも、バリデーションエラーのメッセージを「インスタンス変数に入ったオブジェクトから取り出して表示する」という仕組みがまさにこれでしたね……。
new
アクションで@cat = Cat.new
をnew
テンプレートに渡すshow
アクションで@cat = Cat.find(params[:id])
をshow
テンプレートに渡す
これらのことと全く同じ、というわけですね。
すごく基本的なことを意識できていなかったんだなという反省記事です。