Complemento para validar el valor de un campo personalizado de tipo texto

Tengo un campo de usuario personalizado para almacenar el ID del proyecto del que el usuario es miembro.

Propósito: un usuario que ingresa un ID de proyecto válido (de pago) tiene acceso a categorías de contenido enriquecido.

Verificar si el ID de proyecto ingresado por el usuario corresponde a un ID de proyecto existente es bastante fácil:

# Define el método para verificar el campo personalizado
def validate_projectid_customfield
  # Clave del campo personalizado y lista predefinida
  custom_field_key = 'projectid'
  predefined_list = ["558", "963", "819"]

  # Obtiene el valor del campo personalizado del usuario
  user_field_value = self.custom_fields[custom_field_key]

  # Si el valor no está en la lista predefinida, genera un error
  if !user_field_value.nil? && !user_field_value.empty?
    unless predefined_list.include?(user_field_value)
      # Genera un error de validación que Discourse entenderá
      WHAT TO DO HERE?
    end
  end
end

En este momento, tengo el siguiente código en lugar de ‘WHAT TO DO HERE?’:

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

Pero eso no parece funcionar.

Si tomo la página de perfil y relleno un valor (correcto o incorrecto), el sistema reacciona primero con “¡Guardado!” seguido inmediatamente por “500 Internal Server Error”.

¿Quizás todo se deba al código incorrecto al principio?

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

¿Alguien puede ayudarme o dirigirme a la documentación correcta?

¡Gracias!

Tengo la certeza de que este fragmento de código es lo que causa el error interno del servidor 500:

¿Hay alguien que pueda decirme cómo acceder al valor del campo de usuario de un campo personalizado?

Otras piezas de código que tampoco funcionan:

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

¿Alguna idea / enlace a documentación o código?