背景
railsのscaffold自動生成ばっか使ってると、フォームのデータの行き先はあまり気にしないことが多い。
そんな感じなので、フォームのデータの行き先はどこ?みたいな質問をよく受けます。
あー、そんなん余裕やろと思ってると、rails5になってform_forがform_withに代わってて焦った。
ソッコーでググってなんとかなったが、そのググった内容をまとめておくこととした。
scaffold生成のform_with
scaffoldで生成するとform_withってこんな感じです。
<%= form_with(model: blog, local: true) do |form| %>
いろんなフォーム
<% end %>
これは以下のいづれかから呼び出されている。
<%= render 'form', blog: @blog %>
<%= render 'form', blog: @blog %>
つまり、
form_with(model: blog, local: true) do |form|は、
form_with(model: @blog, local: true) do |form|と同じ意味。
本来のform_withの形
本来form_withは以下のようなたくさんのオプションを持つ。
form_with(model: 〇〇, scope: 〇〇, url: 〇〇, format: 〇〇, ・・・)
このurl: 〇〇がデータの遷移先なのです。
modelオプションはurlを推測してくれる
ではscaffold自動生成の下記はどこにデータが行くのか?
<%= form_with(model: blog, local: true) do |form| %>
いろんなフォーム
<% end %>
実はmodel: blogが行き先を推測してくれているようです。
先ほど説明したよう、blogは@blogと同値なのですが、
-
blog(@blog)が空(@blog = Blogs.newな状態)の場合は、url: blogs_path, method: postを自動推測、つまりBlogsControllerのcreateアクションにデータを送る -
blog(@blog)が空でない(@blog = Blogs.find(〇)な状態)場合は、url: edit_blog_pathを自動推測、つまりBlogsControllerのeditアクションにデータを送る
となっているのですね。
このデータの流れに関してははほとんどform_forと同じで安心しました。