経緯
プログラミング歴3ケ月の初心者です。
先日、個人的にアプリケーションを作成しておりまして…
**「form_with」**を用いてメッセージ投稿フォームを実装していた時のこと。。
= form_with model: @post, url: posts_path, method: :post, html:{ class: "post" } do |f|
= f.text_area :post
= f.submit "投稿する"
あれ、、「投稿する」ボタンを押してもビュー(画面)が推移しないぞ??
モデルやパスを確認しても間違ってはなさそう…
なのに、コントローラーで処理されない。。
そう、私はform_withをわかったふりして完全に舐めていたのです。(もちろんそんな気はありませんでしたが)
なぜなら、今まで勉強してきたのは form_for、form_tag だったので、書き方が変わるだけで同じことができるだろうと思っていました。
原因
早速答えを言っちゃうと、form_withは**自動的にajax処理(非同期通信)**をしてしまうんです!!
もちろん、 form_for、form_tag にはそんな仕様ありませんでした。
解決策
//form_withの最後に local: true を記載してあげます。
= form_with model: @post, url: posts_path, method: :post, html:{ class: "post" }, local: true do |f|
= f.text_area :post
= f.submit "投稿する"
上記のように記載したら、普通に投稿できるようになりました。
ajax処理をしたい場合…そのまま
ajax処理をしない場合…local: true
まとめ
以上になります。
某スクールや○○gateでは form_for、form_tag で勉強することが多いので、
私以外にも今回のような状況に陥ってしまう方がいるのでは?
と思い、今回書いてみました。
form_for、form_tag はとても勉強になるのでform_withに慣れてしまう前に一度勉強してみることを
お勧めしますが、やはり別物なので、form_withもしっかり勉強が必要だなと感じた今日この頃でした。