🤕

【Rails 6】ActionView::Template::Error invalid base64 の解決方法

2022/06/15に公開

結論

Railsのバージョンを5.2.5から6.0.X系にアップデートすると、form_withActionView::Template::Error ~ invalid base64が発生します。
この問題は、Railsのバージョンを6.0.4までアップデートすることで解決します。

参考:
https://github.com/rails/rails/pull/41806

原因

CSRFトークンのフォーマットの違いが原因だそうです。
下のissueによると、Rails 5.2.5ではCSRFトークンのフォーマットにbase64_urlsafeを利用しているのですが、Rails 6.0系ではbase64_strictを利用しているらしく、この違いによってform_withArgumentErrorが起きるようです。

参考:
https://github.com/rails/rails/issues/41783#issue-843370797

https://techracho.bpsinc.jp/hachi8833/2021_04_06/106739#1-3

経緯

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

と書いてあったので、下のツイートのように注意勧告とブラウザの再起動を勧めて、対応を終えました。
https://twitter.com/DiQt_net/status/1534464730097541120

ユーザーからの問い合わせもないので、これで解決したものと思ったんですね。

しかし、それでもまだSentryが怒り続ける。

「なんでかなぁ?Sentryのバグかなぁ?」なんて呑気なこと考えてたら、今日友達から「開けないよ!」と知らせてもらったんですね。
さらに、「ブラウザを閉じても治らない」と!

「マジかよ!!」って思って、他の友達の助けを借りつつ、冷や汗をかきながら調べたら、「結論」のプルリクを見つけてなんとか解決できた、というのが今回の経緯です。

新規ユーザーさんだと全然問題が発生しないみたいなので、
問題の原因は、Railsのバージョンアップデート前にDiQtにアクセスしたときのCookieが残っているかどうか?なのかもしれません。
自信はないです。詳しい方いたらぜひご教授を。。。

反省

反省点としては、

  • Sentryを疑う前に己を疑え!
  • 困ったときは公式のIssueとPullRequestを探せ!
    ですね。。。

ご迷惑をおかけしてしまったユーザー様、本当申し訳ございませんでした。。。🙇‍♂️

そして、バグの報告と解決の確認を行ってくれた なべさん、解決のお手伝いをしてくれたエンドーさん、 本当にありがとうございました!!🙇‍♂️
本当に助かりました...!

あ、あと、これは今日つくってたDiQtの新しいランディングページです。
ノンデザイナーの自分にしては、悪くない出来なんじゃないかなぁと思うのですが、どうですかね??
こうした方がいいよ、みたいなご意見あればぜひ!

https://www.diqt.net/ja

次はRailsのバージョンを6.1に上げるぞ〜。

Discussion