#概要
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'
# (後略)
#参考