【Rails5.1~】form_withのデフォルトが非同期通信でハマった件

初めてTech Blogを書きます、Boosterチームの浜野です!
新卒2年目で、現在は主にRailsで社内のリアルな不動産取引に関わる業務を効率化する為のシステムの開発をしています。

そんな私がハマったちょっとした出来事について書きます。

TL;DR

書いていたら長くなってしまったので、結論を先に書くと…
Rails5.1から登場した form_with はデフォルトがajaxの非同期通信のため、 local: true オプションをつけないとHTMLをレンダリングしてくれません!

→エラーメッセージが表示されない…ログインしても画面遷移しない…そんな方は一度、疑ってみてください。
erbのコードはこんな感じになります。
(modelのところはurlになったりすると思います)

<%= form_with model: @hoge, local: true do |f| %>
.
.
<% end %>

ハマった経緯

ここからは余談です。ほぼ余談。

不動産ということで、金融機関とは切っても切り離せない関係のため(ローン関係や、入出金など)そういった情報を入力する業務に関する機能の開発が多々あります。
それはある日、銀行口座の情報を入力するフォームを作っている時の出来事でした。
金融機関には、それぞれごとに 金融機関コード という数字が存在するため、その入力欄に銀行名を文字列のまま入力されないようにバリデーションをかけたいと思いました。コードなので。

で、よくあるように

存在しない金融機関コードです!
存在しない支店コードです!

といういかにも違うよ感を醸し出すエラーメッセージを表示しようと思ったのですが…

⚠️⚠️⚠️表示されない⚠️⚠️⚠️

きちんとバリデーションはかかっているのに、エラーメッセージが表示されません。
slimを疑ってhamlにしてみたり、renderの書き方を疑ってファイル名の書き方を変えてみたり… そこで、ふと気がついたのです。
ていうか、 form_forとか form_tag はかなりよく見る存在ですが、 form_with 、君は意外と顔見知り程度だぞと… あれ、そういえばrenderしたときに画面が更新されてないんじゃないかと…

最後に

もしかしたら当たり前のことだったかも知れませんが、Rails 4系とか5.0で開発していた人は意外と気がつかないかも、と思い記事にしてみました!
Rails 5.1以降は、from_tagform_for の代わりにform_with を使っていくことが推奨されているようなので、 form_with の特徴もきちんと知っていきたいです。

というわけで、初めてのTech Blogでした!