【Rails 6】ActionView::Template::Error invalid base64 の解決方法
結論
Railsのバージョンを5.2.5から6.0.X系にアップデートすると、form_with
でActionView::Template::Error ~ invalid base64
が発生します。
この問題は、Railsのバージョンを6.0.4までアップデートすることで解決します。
参考:
原因
CSRFトークンのフォーマットの違いが原因だそうです。
下のissueによると、Rails 5.2.5ではCSRFトークンのフォーマットにbase64_urlsafe
を利用しているのですが、Rails 6.0系ではbase64_strict
を利用しているらしく、この違いによってform_with
でArgumentError
が起きるようです。
参考:
経緯
Railsの5.2系を利用されている方の多くは、mimemagicに依存しないように、Railsのバージョンに5.2.5を利用されているかと思います。
僕もその一人でした。
ですがもう2022年ですし、Rails7も出たし、もうそろそろ自分もRails6にアップデートしたいなぁと思ったんですね。
それでmimemagicに依存しないバージョンを探したら、下の動向に
(2021/03/27現在)Rails 5.2.5 / 6.0.3.6 / 6.1.3.1 はmimemagicに依存しなくなりました。これらにバージョンアップしましょう。
https://hackmd.io/@mametter/mimemagic-info-ja
と書いてあったので、バージョンを6.0.3.6
にあげたわけなんですね。
それで大体テストも終わったので、大丈夫そう!と思って本番環境にデプロイしました。
するとSentryが、1日に10件以上、下みたいにすごく怒るわけですよ。
でも、こちらの環境ではまったく問題なく動くし、どうやってもエラーを再現できない。
一応、調べてみたら下の記事のように、
Rails 6にアップグレード後に発生。
ブラウザを何回リロードしても直らないが、ブラウザを一端終了して再起動すれば修正された。
ブラウザのキャッシュとCookieが原因らしい。
https://srcw.net/wiki/index.php?Rails6#s498da97
と書いてあったので、下のツイートのように注意勧告とブラウザの再起動を勧めて、対応を終えました。
ユーザーからの問い合わせもないので、これで解決したものと思ったんですね。
しかし、それでもまだSentryが怒り続ける。
「なんでかなぁ?Sentryのバグかなぁ?」なんて呑気なこと考えてたら、今日友達から「開けないよ!」と知らせてもらったんですね。
さらに、「ブラウザを閉じても治らない」と!
「マジかよ!!」って思って、他の友達の助けを借りつつ、冷や汗をかきながら調べたら、「結論」のプルリクを見つけてなんとか解決できた、というのが今回の経緯です。
新規ユーザーさんだと全然問題が発生しないみたいなので、
問題の原因は、Railsのバージョンアップデート前にDiQtにアクセスしたときのCookieが残っているかどうか?なのかもしれません。
自信はないです。詳しい方いたらぜひご教授を。。。
反省
反省点としては、
- Sentryを疑う前に己を疑え!
- 困ったときは公式のIssueとPullRequestを探せ!
ですね。。。
ご迷惑をおかけしてしまったユーザー様、本当申し訳ございませんでした。。。🙇♂️
そして、バグの報告と解決の確認を行ってくれた なべさん、解決のお手伝いをしてくれたエンドーさん、 本当にありがとうございました!!🙇♂️
本当に助かりました...!
あ、あと、これは今日つくってたDiQtの新しいランディングページです。
ノンデザイナーの自分にしては、悪くない出来なんじゃないかなぁと思うのですが、どうですかね??
こうした方がいいよ、みたいなご意見あればぜひ!
次はRailsのバージョンを6.1に上げるぞ〜。
Discussion