ぶちのブログ

競プロとCTFが趣味なWebエンジニアのアウトプットの場

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'

これで最新版が入るようになり、起動に成功。
特にソースコード自体は変更しなくても動いていそう。

おわりに

起動してちゃんと動いていそうなところまでは確認しました。
細かい挙動までは追えていないので、挙動が変わっている可能性があるので、参考にする際は注意してください。