起きたエラー
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
