はじめに
よく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が自動推測でよしなにしてくれるからなのかなと個人的に感じてます。
なにか間違っているところ、追加で聞きたいことなどあればコメントください!