Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Rails5のform_withのデータの行き先

More than 3 years have 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と同じで安心しました。

kakiuchis
京都の大学と大学院で光合成の基礎研究→中国のパン屋で見習いパン職人→インドネシアの工場で小さな備品調達→IT人材サービス会社で苦手な営業担当→RubyとAIのプログラミングスクールでちょっとだけ教材作成お手伝い。
itpm-gk
頑張るエンジニアを応援する会社です。まだまだ発展途上です!
https://www.itpm-gk.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away