Rails6正式版でRedisを使うときにハマったこと
TL;DR
Rails6ではredis-railsではなくredis-actionpackを使おう
はじめに
先日、Rails6正式版がリリースされました。さっそくアップデートしようと思ったらredis周りでハマったため、解決策を書きます。
最初のエラーと解決策
Bundler could not find compatible versions for gem "actionpack": In snapshot (Gemfile.lock): actionpack (= 6.0.0) In Gemfile: active_model_serializers was resolved to 0.10.10, which depends on actionpack (>= 4.1, < 6.1) redis-rails was resolved to 5.0.2, which depends on redis-actionpack (>= 3.0, < 6) was resolved to 3.1.3, which depends on actionpack (= 3.1.3) Running `bundle update` will rebuild your snapshot from scratch, using only the gems in your Gemfile, which may resolve the conflict.
書いてあるとおり、redis-railsはrails6には対応していないらしい。調べてみたところ以下のissueを発見。
Rails 6 support · Issue #95 · redis-store/redis-rails · GitHub
redis-railsの代わりにredis-actionpackを使えばいいらしい。
次のエラーと解決策
無事redis-actionpackをinstallした後、Railsを起動しようとしたら以下のエラーが発生。
Redis is not a module Redis is not a class
ちょっとよくわからないのですが、バージョン指定しない場合は何故かredis-actionpackのv0.0.0がインストールされてしまうことが原因の模様。以下のissueが該当。
conflict with resque? Redis is not a module · Issue #118 · redis-store/redis-store · GitHub
後々のアップデートを考えると、わざわざバージョンを明記したくはなかったので、Gemfileの記述を以下のように変更。
gem 'redis-actionpack', github: 'redis-store/redis-actionpack'
これで最新版が入るようになり、起動に成功。
特にソースコード自体は変更しなくても動いていそう。
おわりに
起動してちゃんと動いていそうなところまでは確認しました。
細かい挙動までは追えていないので、挙動が変わっている可能性があるので、参考にする際は注意してください。