概要
Ruby on Railsにおいてフォームでバリデーションエラーになったあと、その画面をリロードしたときに、URLへのリクエストメソッドがPOSTではなくGETになってしまうという問題が起きました。
どのようにしてその問題を解決すれば良いか、調べてもすぐにはわからなかったので、本記事ではその対処法などについてまとめます。
環境
Ruby 2.6.4
Ruby on Rails 5.2.3
Turbolinks 5.2.1
問題
期待していた動き
フォームでバリデーションエラーになったあと、その画面をリロードしたときに、
画面上に「フォーム再送信の確認」というダイアログが出る。
実際の動き
URLへのリクエストメソッドがPOSTではなくGETになってしまい、
GETメソッドでの/usersへのルーティングがないため、その旨のエラー画面が表示されてしまった。
原因
Turbolinksが原因です。
Turbolinksがhistory apiで履歴を操作しており、history apiに履歴を足すときはGETメソッドでのURLしか足せないため、URLをGETで取得しようとする…らしいです。
正直くわしいところはわかりませんでした。
Turbolinksとは、jsとcssの読み込み処理を省略することで、画面遷移を高速化させる組み込みライブラリです。
くわしくは、以下の記事をご参照ください。
対処法
1. application.js
から//= require turbolinks
を削除する。
Before
//= require rails-ujs
//= require activestorage
//= require turbolinks
//= require_tree .
After
//= require rails-ujs
//= require activestorage
//= require_tree .
これで問題は解決されますが、Turbolinksは不要になったので、これ以降の手順もしましょう。
2. Gemfile
からgem 'turbolinks'
を削除する。
Before
# (前略)
gem 'coffee-rails', '~> 4.2'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.5'
# (後略)
After
# (前略)
gem 'coffee-rails', '~> 4.2'
gem 'jbuilder', '~> 2.5'
# (後略)
3. application.html.erb
からdata-turbolinks-track': 'reload'
を削除する。
Before
doctype html
html
head
title
| Application
= csrf_meta_tags
= csp_meta_tag
= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload'
= javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
# (後略)
After
doctype html
html
head
title
| Application
= csrf_meta_tags
= csp_meta_tag
= stylesheet_link_tag 'application', media: 'all'
= javascript_include_tag 'application'
# (後略)