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 のデフォルトになっていることに注意してください。