プロジェクトシートK(仮)

技術の吐き溜めなどなど

【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に悩む人が減ればいいね。

 

参考記事:

こちらの記事を見つけて解決できました。ありがとうございました!!

 

qiita.com

 

kray.jp