【Rails】ActionController::InvalidAuthenticityTokenの解決方法(CSRFを無効にしても例外が出るとき)
自分が3時間くらい悩まされてようやく解決できたので、簡単に共有します。
症状:
ActionController::InvalidAuthenticityTokenが出てくるんだけど、ググってみてもCSRFを無効にしたら解決するとか、form_tagを使うとかしか情報が出てこない…無効にしても例外出るし、なんかWebリロードしてpostするとなぜか例外でなくなるし、なんでや…
原因・戦犯:
>>>>turbolinks<<<<
こいつでした。
turbolinksってなんぞや
Webの高速化のために、いちいちページを読み込まずにヘッダー情報は省略して読み込もうぜっていうRailsのGemみたいです。(超簡略化解説)
Rails 4以降に標準搭載になったみたい。
こいつが機能したままだと、
- jQueryのreadyイベンドが実行されない
%(function(){})内の処理が実行されません!ページを更新すると実行されます。
- metaタグが更新されない
これが、今回CSRFを無効にしpostをしてもエラーに引っかかってしまった原因みたいです。metaタグの中にCSRFトークンがあるってことは、要するにturbolinksが機能するとこのトークンまで更新されなくなっちゃうっていうわけですね。
てか、そもそもCSRFを無効にしているのに引っかかる意味が分からない。なぜだ(情報求む)
また、このturbolinksが機能するときはGETメソッドでページ遷移したときのみなので、ページ更新したりするとエラーが消えたってわけですね。なんてややこしい…w
対策:
turbolinksを消しましょう。ここからの内容はほぼこの記事と同じです。
Gemfileに記述されている
gem 'turbolinks', '~> {version}'
を消し、bundle update。app/assets/javascripts/application.jsに記述されている
//= require turbolinks
を消す。これでOK!
余談:
この類の話は、InvalidAuthenticityToken関連で調べると全然出てこなかったんだけど、jQueryが機能しない件で調べたら一瞬で見つかりましたw例外出るのと同じタイミングでjQueryが実行されない問題も出てて、同じ原因なんだろうな~ってなんとなく察してたからたどり着けました。
同じ現象に悩まされる人も多そうだなぁと思ったので、記事にしてみた次第。InvalidAuthenticityTokenに悩む人が減ればいいね。
参考記事:
こちらの記事を見つけて解決できました。ありがとうございました!!