RailsとDockerでアプリ開発をしています。
Deviseによる認証機能を実装しようとgemをインストールし、Userテーブルを作成、db:migrateしたところ、localhost3000で次のようなエラーが発生しました。
ActiveRecord::PendingMigrationError
「移行が保留中です」という意味になります。
先に解決した方法をお伝えします。
【結論】解決法 Run pending migrationsを押す
初めは気が付かなかったのですが、エラー画面の中にRun pending migrationsというボタンがあります。

これを押しただけで解決しました。
とても簡単
確認・試したこと(これらは全滅でした)
マイグレーション状態の確認
docker compose exec web bin/rails db:migrate:status
→ ステータスはすべて up。DBには反映されている。
マイグレーションファイルも作られていますが、何も触っていないです。
Dockerコンテナ再起動
docker compose down
docker compose up
docker compose restart web
ページのリロードもしましたが効果なし
Rails環境の確認
「開発(development)なのに本番モード(production)で動いているから挙動がおかしいのでは?」とAIから指摘をもらったので、gemを追加するまでは問題なく表示されていたのでそんなことあるのかと疑問に思いつつも確認しました。
docker compose exec web bin/rails runner "p Rails.env"
→"development"
しっかり開発環境になっていました。
PIDファイルの削除
docker compose exec web rm -f tmp/pids/server.pid
PIDファイルの削除も試しましたが、これはサーバーが「起動すらできない」時の対処法なので、今回のように「起動しているがエラーが出る」ケースでは関係がありませんでした。
なぜエラーになった?
はっきりした原因は断定できませんが、
migration 自体は DB に適用されているにもかかわらず、
起動中の Rails プロセスが「未適用の migration がある」と判定してしまった状態でした。
Run pending migrations ボタンは、
今まさに動いている Rails サーバープロセス自身が migration を再確認・実行するため、
このズレが解消され、正常に表示されるようになったと考えられます。
同じエラーに遭遇した場合は、
コマンドを疑う前に、まず Run pending migrations を押してみるのも一つの手だと思います。
