高木のブログ

Rails6.1からform_withで同期通信(local: true)がデフォルトになった

2021/12/27

先日Rails7が出たが、仕事でもプライベートでも未だに6.0系を使っている
そろそろ上げないとまずいと思い、とりあえず個人アプリの1つをRails6.1系にあげた
そんな大きなアプリではないので、1カ所だけ仕様変更の対応をしてアップグレードは無事終わった

問題

非同期通信で更新している部分がエラーを吐いた

SettingsController#create is missing a template for this request format and variant.
request.formats: ["text/html"]
request.variant: []

原因

タイトル通りで、 form_with で同期通信がデフォルト(local: true)になったため
6.0系までは非同期通信がデフォルト(local: false)だったので、オプションの指定を省略していた

プルリクエスト

https://github.com/rails/rails/pull/40708

解決方法

form_with のオプションに local: false を指定する

-<%= form_with url: settings_path do |form| %>
+<%= form_with url: settings_path, local: false do |form| %>

生成されるHTMLタグ

data-remote="true" が付くようになり、今まで通り非同期で更新するようになった

-<form action="/settings" accept-charset="UTF-8" method="post">
+<form action="/settings" accept-charset="UTF-8" data-remote="true" method="post">

参考


ytkg

Written by ytkg, Twitter, GitHub