Plugin pour valider la valeur d'un champ personnalisé de type texte

J’ai un champ personnalisé pour l’utilisateur afin de stocker l’identifiant du projet dont l’utilisateur est membre.

Objectif : un utilisateur qui saisit un identifiant de projet valide (payant) a accès à des catégories de contenu enrichies.

Vérifier si l’identifiant de projet saisi par l’utilisateur correspond à un identifiant de projet existant est assez facile :

# Définir la méthode pour vérifier le champ personnalisé
def validate_projectid_customfield
  # Clé du champ personnalisé et liste prédéfinie
  custom_field_key = 'projectid'
  predefined_list = ["558", "963", "819"]

  # Obtenir la valeur du champ personnalisé de l'utilisateur
  user_field_value = self.custom_fields[custom_field_key]

  # Si la valeur n'est pas dans la liste prédéfinie, lever une erreur
  if !user_field_value.nil? && !user_field_value.empty?
    unless predefined_list.include?(user_field_value)
      # Lever une erreur de validation que Discourse comprendra
      QUE FAIRE ICI ?
    end
  end
end

Pour le moment, j’ai le code suivant à la place de ‘QUE FAIRE ICI ?’

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

Mais cela ne semble pas fonctionner.

Si je prends la page de profil et que je saisis une valeur (correcte ou incorrecte), le système réagit d’abord par “Sauvegardé !” immédiatement suivi de “500 Internal Server Error”.

Peut-être que tout cela est dû au mauvais code au début ?

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

Quelqu’un peut-il m’aider ou m’orienter vers la bonne documentation ?

Merci !

Je sais avec certitude que ce morceau de code est ce qui cause l’erreur interne du serveur 500 :

Y a-t-il quelqu’un qui puisse me dire comment accéder à la valeur du champ utilisateur d’un champ personnalisé ?

D’autres morceaux de code qui ne fonctionnent pas non plus :

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

Des idées / des pistes vers la documentation ou le code ?