my_back_pages

プログラミング学習の記録 Ruby / Rails / FjordBootCamp

【Rails初心者】createアクションでモデルオブジェクトの保存失敗時に、入力情報を保持したままフォームを表示することができる理由

/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.newnewテンプレートに渡す
  • showアクションで@cat = Cat.find(params[:id])showテンプレートに渡す

これらのことと全く同じ、というわけですね。

すごく基本的なことを意識できていなかったんだなという反省記事です。