Rails6.1からform_withがデフォルトでdata-remote = "true"オフになっていた。

はじめに

少し今更感のある記事かもしれないですが、数ヶ月フロント周りをRailsで書いていなかった私はタイトルのことを先日知りました。
浦島太郎気分になったので、簡単に記事にしておきます。

概要

Railsでform_withヘルパーを使う際に、Rails 6.0、5.2、5.1ではデフォルトでAjaxレスポンスを返すようになっていました。
しかし、Rails 6.1ではデフォルトでAjax通信を行わないように変更されたため、従来通りAjax通信を使用したい場合には、config/application.rbで以下の設定をしておく必要があります。

config.action_view.form_with_generates_remote_forms = true

Rails 6.1以前はどうだった?

Rails 6.0、5.2、5.1では手軽にAjax化するため、ヘルパーメソッドのform_withはデフォルトでAjax通信を行うようになっており、formタグにdata-remote = "true"を付与していました。

逆を言えば、通常の画面遷移を期待する場合は、local: trueを明示的に指定する必要がありました。

なんでremoteなしになった?

こちらのissueでは以下のように指摘されています。

That is a problem because it forces the unsuspecting user to handle XHR requests.

github.com

つまり、通常はHTTPレスポンスを期待しているのに、Ajaxレスポンスを返されると困惑してしまうよってことですね。
もともとTurbolinksを意識して、remote=trueがデフォになっていたようなので、Trubolinks使ってないよっていうほとんどの人からすれば、余計なお世話になってしまっていたようです。

remote=trueをデフォルトにしたい場合

概要にすでに記載済みですが、あえてremote=trueをデフォルトにしたい場合は、別途設定しておく必要があります。

<再掲>

config.action_view.form_with_generates_remote_forms = true

 

参考

Rails 6.1で form_withのデフォルトが「remoteなし」になった(翻訳)|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社

HotwireからDHHが考えるこれからのRailsとJSの付き合い方を知る - Speaker Deck

当サイトは、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。