6
3

More than 1 year has passed since last update.

RailsアプリケーションのRubyのバージョンを3.1にあげたらYAMLの読込に失敗しました。

Posted at

起きたエラー

PubDictionariestというRailsアプリケーションをメンテナンスしています。
RubyとRailsのバージョンを上げたところ、Railsアプリケーションの起動時にエラーが起きるようになりました。

image (2).png

メッセージを読めばわかるとおり、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の両方に対応したい場合は、このように書くとよいようです。

関連記事

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3