26
20

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.

【Rails】form_withがどうやってデータを飛ばしているのか

26
Last updated at Posted at 2018-11-21

はじめに

よくRailsは**「ブラックボックスだらけだ」**と聞きます。

初学者の自分にとって一番ブラックボックスに感じたのはform_withでした。

なんでこの書き方でちゃんとデータがDBに登録されるのかがわかりにくいので、それを紐解いてみましょう!

どこでどうやってデータを飛ばすモデルの指定をしているの?

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

早速本題から入るんですが、**model: @blog**でもうBlogモデルにデータを飛ばすことが決まるんです。

じゃあもっと具体的に見ていきましょう!

@blogにはなにがはいっている?

先ほどの**model: @blog**の@blogに何が入っているかでRailsがコントローラのアクションを決めてくれます。

○newのとき

new.html.erb
                   # @blog = Blog.newの場合
<%= form_with(model: @blog, local: true) do |form| %>

@blogが**Blog.newの場合、pathがblog_path、HTTPメソッドがPOST**になります。

ルーティングを見るとわかると思いますが、blog_pathでPOSTなのはコントローラの**create**になります。

これはRailsが自動推測してくれているおかげなんです!

じゃあ次はeditのときをみてみましょう。

○editのとき

new.html.erb
                   # @blog = Blog.new(blog_params)の場合
<%= form_with(model: @blog, local: true) do |form| %>

今度は@blogにblog_paramsで元々の値が入っています。

@blogが**Blog.new(blog_params)で値が入っている場合、pathがblog_path、HTTPメソッドがPATCH**になります。

ちなみにblog_pathでPATCHなのはコントローラの**update**になります。

これもRailsの自動推測のおかげですね!

まとめ

同じ書き方でもインスタンス変数になにがはいっているかで動きが変わるのがわかったと思います。

最初、form_withに慣れなかったのはRailsが自動推測でよしなにしてくれるからなのかなと個人的に感じてます。

なにか間違っているところ、追加で聞きたいことなどあればコメントください!

26
20
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
26
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?