LoginSignup
26
20

More than 5 years have passed since last update.

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

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| %>

@blogBlog.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で元々の値が入っています。

@blogBlog.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