Techioz Blog

Ruby 3.1 にアップグレードすると、YAML.load_file の使用時に Psych::DisallowedClass 例外が発生する

概要

Ruby 3.1 にアップグレードするときに、YAML.load_file some_file_name を使用すると次の並べ替えエラー メッセージが表示されます。

 Psych::DisallowedClass:
   Tried to load unspecified class: Matrix

他のロードステートメントでも同様のエラーが発生しますが、異なる未指定のクラスが引用されています。オープンストラクト。最新バージョンの YAML は、許可されたホワイト リストからクラスのみをロードするようです。そのため、他のクラスを許可するには、 allowed_class キーワードを使用する必要があります。私が試してみました

hsh = YAML.load_file some_file_name, permitted_classes: [Matrix, OpenStruct]

しかし、これはエラーになります

 Psych::DisallowedClass:
   Tried to load unspecified class: Symbol

これを修正するにはどうすればよいですか?

解決策

Ruby で YAML をロードする場合、デフォルトではシンボルも許可されません。したがって、YAML ファイルを読み取るときに、あなたのケースでも Symbol を allowed_classes に追加する必要があります。

hash = YAML.load_file(
  some_file_name, 
  permitted_classes: [Matrix, OpenStruct, Symbol]
)

Psych (Ruby で使用される YAML パーサー) のデフォルトの allowed_classes のリストを参照してください。

または、Ruby on Rails で使用する場合は、YAML ファイルを読み取るときに Ruby on Rails アプリケーションが許可クラスとして許可するクラスを config/application.rb でグローバルに構成できます。

config.active_record.yaml_column_permitted_classes += [Matrix, OpenStruct, Symbol]

Ruby on Rails の内部 YAML 解析では、シンボルがすでに active_record.yaml_column_permitted_classes のデフォルトになっていることに注意してください。