LoginSignup
17
9

More than 5 years have passed since last update.

YAML.load を YAML.safe_load に書き換えると Psych::BadAlias エラーが発生する

Last updated at Posted at 2017-04-18

問題

RSpec のコードで Rubocop の "Block has too many lines." という警告を無視したい に引き続き、Rubocop のバージョン更新でひっかかったこと 2 つ目です。

Rubocop を実行すると Security/YAMLLoad という cop に怒られました :cop_tone1:

Prefer using YAML.safe_load over YAML.load.

YAML.load にはセキュリティ上の問題があるため、YAML.safe_load に書き換えろという内容です (参考 PR) 。

Rubocop の自動修正で YAML.loadYAML.safe_load に修正したのですが、修正したコードを実行すると次のエラーが発生しました。

file = Rails.root.join('config/database.yml').read

YAML.safe_load(file)
#=> Psych::BadAlias: Unknown alias: default

これは Rails の config/database.yml を読み込むコードなのですが、YAML ファイル内で &default という名前の エイリアス を使っているのが原因のようです。ただ、エイリアス自体は YAML の機能ですし、YAML ファイルの文法も間違っていません。

解決策

YAML.safe_load(file, [], [], true)
#=> Hash object

のように、エイリアス機能を利用するには YAML.safe_load の第 4 引数に true を渡す必要がありました。詳しくは YAML.safe_load のドキュメント を参照してください。

17
9
3

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
17
9