はじめに
よくRailsは**「ブラックボックスだらけだ」**と聞きます。
初学者の自分にとって一番ブラックボックスに感じたのはform_withでした。
なんでこの書き方でちゃんとデータがDBに登録されるのかがわかりにくいので、それを紐解いてみましょう!
どこでどうやってデータを飛ばすモデルの指定をしているの?
<%= form_with(model: @blog, local: true) do |form| %>
早速本題から入るんですが、**model: @blog**でもうBlogモデルにデータを飛ばすことが決まるんです。
じゃあもっと具体的に見ていきましょう!
@blogにはなにがはいっている?
先ほどの**model: @blog**の@blogに何が入っているかでRailsがコントローラのアクションを決めてくれます。
○newのとき
# @blog = Blog.newの場合
<%= form_with(model: @blog, local: true) do |form| %>
@blogが**Blog.newの場合、pathがblog_path、HTTPメソッドがPOST**になります。
ルーティングを見るとわかると思いますが、blog_pathでPOSTなのはコントローラの**create**になります。
これはRailsが自動推測してくれているおかげなんです!
じゃあ次はeditのときをみてみましょう。
○editのとき
# @blog = Blog.new(blog_params)の場合
<%= form_with(model: @blog, local: true) do |form| %>
今度は@blogにblog_paramsで元々の値が入っています。
@blogが**Blog.new(blog_params)で値が入っている場合、pathがblog_path、HTTPメソッドがPATCH**になります。
ちなみにblog_pathでPATCHなのはコントローラの**update**になります。
これもRailsの自動推測のおかげですね!
まとめ
同じ書き方でもインスタンス変数になにがはいっているかで動きが変わるのがわかったと思います。
最初、form_withに慣れなかったのはRailsが自動推測でよしなにしてくれるからなのかなと個人的に感じてます。
なにか間違っているところ、追加で聞きたいことなどあればコメントください!