背景
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
と同じで安心しました。