Edited at

Rails5のform_withのデータの行き先

More than 1 year has passed since last update.


背景

railsscaffold自動生成ばっか使ってると、フォームのデータの行き先はあまり気にしないことが多い。

そんな感じなので、フォームのデータの行き先はどこ?みたいな質問をよく受けます。

あー、そんなん余裕やろと思ってると、rails5になってform_forform_withに代わってて焦った。

ソッコーでググってなんとかなったが、そのググった内容をまとめておくこととした。


scaffold生成のform_with

scaffoldで生成するとform_withってこんな感じです。


_form.html.erb

<%= form_with(model: blog, local: true) do |form| %>

いろんなフォーム
<% end %>

これは以下のいづれかから呼び出されている。


new.html.erb

<%= render 'form', blog: @blog %>



edit.html.erb

<%= 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.html.erb

<%= form_with(model: blog, local: true) do |form| %>

いろんなフォーム
<% end %>

実はmodel: blogが行き先を推測してくれているようです。

先ほど説明したよう、blog@blogと同値なのですが、



  • blog(@blog)が空(@blog = Blogs.newな状態)の場合は、url: blogs_path, method: postを自動推測、つまりBlogsControllercreateアクションにデータを送る


  • blog(@blog)が空でない(@blog = Blogs.find(〇)な状態)場合は、url: edit_blog_pathを自動推測、つまりBlogsControllereditアクションにデータを送る

となっているのですね。

このデータの流れに関してははほとんどform_forと同じで安心しました。