起きたエラー
PubDictionariestというRailsアプリケーションをメンテナンスしています。
RubyとRailsのバージョンを上げたところ、Railsアプリケーションの起動時にエラーが起きるようになりました。
メッセージを読めばわかるとおり、Psych::Load
メソッドでエラーが起きています。
原因
Ruby 3.1からYAML.load
メソッドの内部で使っているPsych::Load
メソッドで読み込めるYAMLファイルのフォーマットに制限が増えたことが原因です。
Ruby 3.1ではRubyに同梱されるpsych のバージョンが4にあがりました。
YAML.load
メソッドで <<: *default
を使っているYAMLを読み込むとエラーになる非互換がふくまれています。
対策
YAML.load
メソッドの代わりに YAML.unsafe_load
を使うと読み込めます。
Fix compatibility with psych >= 4.
Railsは6.1.4で対応済みです。
前述のエラーメッセージをよく読むとdatabase.yaml
などのRailsの標準の設定ファイルではエラーはおきていません。
config/initializers/elasticsearch.rb
という名前のカスタム初期化ファイルでエラーが起きています。
PubDictionariesはElasticsearch用の設定ファイルをYAMLで用意しています。
config/initializers/elasticsearch.rb
はこの設定ファイルを読み込んでいます。
読込にはYAML.load_file
メソッドを使っています。ここでエラーが起きていました。
YAML.load_file
メソッドの代わりに YAML.unsafe_load_file
を使って対応しました。
補遺
YAML.respond_to?(:unsafe_load) ? YAML.unsafe_load(source) : YAML.load(source)
psych3 とpsych4の両方に対応したい場合は、このように書くとよいようです。
関連記事
- https://qiita.com/Bjp8kHYYPFq8MrI/items/90a9db03160f8d6f7e5c
- https://qiita.com/hiroyukiwk/items/a7b85235d8ef927e2825
- https://qiita.com/scivola/items/da2e4687726fb20953c0
- https://qiita.com/kandalog/items/8fd20f79ecf73034795a
- https://qiita.com/cookie20000917/items/87f08be87d00cdaa0aca
- https://qiita.com/hiroyuki_onodera/items/d26b7c8d6c352cd95a16
- https://qiita.com/mono_glyceride/items/a447f2451078e8031cbc