マイグレーションファイル作成時にcannot load such file -- net/smtp (LoadError)エラー

実現したいこと

Migrationファイルを作成しようと、以下のコマンドを実行したところエラーが発生し、実行できませんでした。

$ rails g migration マイグレーションファイル名

エラーメッセージ

cannot load such file -- net/smtp (LoadError)

エラー原因

Ruby3.1で標準ライブラリからいくつかのライブラリが除外されていたことにより、マイグレーションファイル作成時に使用しようとしたnet-smtpライブラリが見つかりませんというエラーでした。

以下のライブラリが新たに bundled gems になりました。Bundler から利用する場合は Gemfile に明示的に指定してください。

  • net-ftp 0.1.3
  • net-imap 0.2.2
  • net-pop 0.1.1
  • net-smtp 0.3.1
  • matrix 0.4.2
  • prime 0.1.2
  • debug 1.4.0

https://www.ruby-lang.org/ja/news/2021/12/25/ruby-3-1-0-released/

Ruby 3.1では、上記のgemが標準ライブラリから除外されて、必要な際は個別にGemfileに記載してインストールする必要があります。

解決法

net-smtpをGemfileに記載後、bundle installコマンドでインストールをしました。

gem 'net-smtp'

その後、$ rails g migration マイグレーションファイル名を実行し、マイグレーションファイルを再度作成しようとしたのですが、、、今度は、違うエラーが出てしまいました。

2つ目のエラーメッセージ

Cannot load database configuration:
Unknown alias: default (Psych::BadAlias)

エラー原因2つ目

psychというYAML解釈用のGemの4系と3系で解釈が変わっているためです。

Rubyには標準でpsychというYAML解釈用のGemがあります。しかし、新しいバージョンである4系からは、YAMLの解釈方法が変わったため、今まで読み込むことができていたYAMLファイルを読み込めなくなってしまったのです。

2つ目解決法

gemは、バージョンを記載しないと新しいバージョンが優先して利用されるため、3系を使いたい時はgemfileにバージョンを明示してあげます。

gem 'psych', '~> 3.1'

その後、bundle installを実行しました。3系であれば以前と同じ解釈法が使われるため上手く読み込むことが出来ました。マイグレーションファイルも無事作成出来ました!!やったー!!

$ rails g migration マイグレーションファイル名
=> Running via Spring preloader in process 77124
      invoke  active_record
      create    db/migrate/マイグレーションファイル名.rb

参考にしたURL

Ruby3.1でherokuにデプロイしたらクラッシュした

Ruby 3.1.0 リリース

psych::badalias: unknown alias: defaultで Railsコマンドが使えないを解決