🐛

Psych::BadAlias Unknown alias: defaultのエラーの原因とその対応

2023/09/01に公開

前提

  • Ruby:3.0.0
  • rails:6.1.3.1

経緯

Rubyを3.0.0から3.1に上げたところ、railsアプリ立ち上げ時に以下のようなエラーが発生した。

/usr/local/bundle/gems/psych-3.3.0/lib/psych/visitors/to_ruby.rb:420:in `resolve_class': Unknown alias: default (Psych::BadAlias)

原因

Ruby3.1から新たにPsychのバージョンが4.0に上がり、Psych.loadsafe_load を利用するようになった。

Psych 4.0 では Psych.load が safe_load を利用するように変更されました。この挙動が影響ある場合は、従来の挙動である unsafe_load を利用する Psych 3.3.2 を移行パスとして利用できます。[Bug #17866]

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

この変更は以下のような背景があるらしい。

loadメソッドが正しく使われないと脆弱になる可能性があるので、デフォルトでsafe_loadを実行するように

ref: https://techracho.bpsinc.jp/hachi8833/2021_05_18/107813#3-3

対応

Rails6.1.4にて、このPsych4.0への互換性の対応が行われたので、railsのバージョンを6.1.3.1から6.1.4にバージョンアップした。

Starting in Psych 4.0.0 YAML.load behaves like YAML.safe_load. To preserve compatibility Rails.application.config_for now uses YAML.unsafe_load if available.

ref: https://github.com/rails/rails/releases/tag/v6.1.4

対応としては、sale_load がデフォルトになったために、制約が厳しくなるので、可能な箇所では unsafe_load を使うようになったということ。

あるいはこの記事(visit_Psych_Nodes_Alias': Unknown alias: default (Psych::BadAlias) 解決方法)で言われているように、Psychのバージョンを下げることでも対応できるらしい。

GitHubで編集を提案

Discussion