解決できました。
ユーザーが見つからない場合にエラーを発生させるようにコードが更新されたようで、nilかどうかを比較する代わりにrescueする必要がありました。
begin
resp = client.get("/users/by-external/#{user.id}")
rescue DiscourseApi::NotFoundError => error
puts error.response.body['errors'].first
sync_user(user)
else
resp.response.env.body['user']
end
また、レスポンスが次のように変更されました。
resp['body']['user']
から
resp.response.env.body['user']
最後に残った問題は、client.sync_sso を呼び出すと、内部サーバーエラー500が発生することです。
ログには次のように表示されています。
ActiveRecord::RecordNotUnique (PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "user_emails_pkey"
しかし、Railsコンソールでまったく同じ詳細を使用してclient.sync_ssoを実行すると、問題なく動作します。
参考までに、上記のコードが再び機能するようにエンドポイントは変更していません。そのため、/users/by-external/ は依然として有効なようです。