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