テキスト型カスタムフィールドの値を検証するプラグイン

ユーザーが所属するプロジェクトの projectid を保持するためのカスタムユーザーフィールドがあります。

目的:有効な(有料の)projectid を入力したユーザーは、リッチコンテンツカテゴリにアクセスできます。

ユーザーが入力した projectid が既存の projectid に対応するかどうかを確認するのは比較的簡単です。

# カスタムフィールドをチェックするメソッドを定義する
def validate_projectid_customfield
  # カスタムフィールドのキーと定義済みリスト
  custom_field_key = 'projectid'
  predefined_list = ["558", "963", "819"]

  # ユーザーのカスタムフィールド値を取得する
  user_field_value = self.custom_fields[custom_field_key]

  # 値が定義済みリストに含まれていない場合は、エラーを発生させる
  if !user_field_value.nil? && !user_field_value.empty?
    unless predefined_list.include?(user_field_value)
      # Discourse が理解できる検証エラーを発生させる
      WHAT TO DO HERE?
    end
  end
end

現在、「WHAT TO DO HERE?」の代わりに次のコードがあります。

self.errors.add(:base, I18n.t("user.project.invalid_value"))
raise ActiveRecord::RecordInvalid.new(self)

しかし、それは機能しないようです。

プロファイルページで値を(正しくても間違っていても)入力すると、システムは最初に「保存しました!」と反応し、すぐに「500 Internal Server Error」と表示されます。

もしかしたら、すべて最初のコードが間違っているからでしょうか?

after_initialize do
  add_model_callback(User, :before_save) do
    validate_projectid_customfield
  end
end

どなたか助けていただけますか、または正しいドキュメントを教えていただけますか?

ありがとうございます!

このコードが500内部サーバーエラーの原因であることは確かです。

カスタムフィールドのユーザーフィールド値を取得する方法を教えてくれる方はいませんか?

機能していない他のコードの一部:

custom_field_value = self.user.reload.custom_fields[custom_field_key]
custom_field_value = UserCustomField.where(user_id: self.user.id, name: custom_field_key).pluck(:value).first

何かアイデア/ドキュメントやコードへのポインタはありますか?