70
60

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rails5のform_withのデータの行き先

Last updated at Posted at 2017-12-24

背景

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

70
60
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
70
60

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?