はじめに
「[Ruby]Ruby 2.7 -> 3.1.2 に上げたときのエラーの修正方法」の続きの記事です。
Ruby 2.7 -> 3.1 に上げた際にひたすらはまったので忘備録です。
事象
以下のエラーが発生しました。
/usr/local/lib/ruby/3.1.0/psych/visitors/to_ruby.rb:430:in `visit_Psych_Nodes_Alias': Unknown alias: default (Psych::BadAlias)
いろいろ調べると ライブラリの v3 と v4 で互換性がなくなった[1][2]ことが原因のようです。脆弱性の原因となりうるのでエイリアスはデフォルトで不可となったことが原因です。暫定対応[1]でもよいのですが、どのみち対応しないと後々辛くなるので v4 の様式に合わせて修正します
対応
一般的に以下を修正が必要です。
config/database.yml
大抵は develop と test 環境で 設定を共有していることが多いので以下の様に記載していることが多いです。database 名のみ差異があり、その他は同じ場合は以下のように記載していることが多いと思います。
default: &default
adapter: mysql2
encoding: utf8mb4
charset: utf8mb4
collation: utf8mb4_general_ci
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
host: <%= ENV.fetch("DB_HOST", "127.0.0.1") %>
username: root
password: <%= ENV.fetch("DB_PASS") %>
database: <%= ENV.fetch("DB_NAME") %>
development:
<<: *default
database: app_develop
test:
<<: *default
database: app_test
エイリアスがデフォルト不可となったので以下のように修正します。
development:
adapter: mysql2
encoding: utf8mb4
charset: utf8mb4
collation: utf8mb4_general_ci
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
host: <%= ENV.fetch("DB_HOST", "127.0.0.1") %>
username: root
password: <%= ENV.fetch("DB_PASS") %>
database: app_develop
test:
adapter: mysql2
encoding: utf8mb4
charset: utf8mb4
collation: utf8mb4_general_ci
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
host: <%= ENV.fetch("DB_HOST", "127.0.0.1") %>
username: root
password: <%= ENV.fetch("DB_PASS") %>
database: app_test
大抵の場合、この修正で問題なくなります。しかし、同じエラーが発生して消えませんでした。
しかし、 grep してもヒットしないケースがあります。
その場合、 config/credentials.yml.enc を疑ってください。
このファイルは grep でヒットしない&基本的に触れないので意識が及ばないことが多いです。
私のプロジェクトでは上記ファイルを修正すれば対応ができました。
おわりに
config/credentials.yml.enc って普段触れないので意識がいかないですよね。
参考
[1] Psych gemにbreaking change, https://techracho.bpsinc.jp/hachi8833/2021_05_18/107813#3-3
[2] psych::badalias: unknown alias: defaultで Railsコマンドが使えないを解決, https://qiita.com/kandalog/items/8fd20f79ecf73034795a
コメント