前提
- 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.load
が safe_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 usesYAML.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のバージョンを下げることでも対応できるらしい。