Plugin per convalidare il valore di un campo personalizzato di tipo testo

Ho un campo utente personalizzato per memorizzare il projectid del progetto di cui l’utente è membro.

Scopo: un utente che inserisce un projectid valido (a pagamento) ha accesso a categorie di contenuti avanzati.

Verificare se il projectid inserito dall’utente corrisponde a un projectid esistente è abbastanza facile:

# Definire il metodo per controllare il campo personalizzato
def validate_projectid_customfield
  # Chiave del campo personalizzato e lista predefinita
  custom_field_key = 'projectid'
  predefined_list = ["558", "963", "819"]

  # Ottenere il valore del campo personalizzato dell'utente
  user_field_value = self.custom_fields[custom_field_key]

  # Se il valore non è nella lista predefinita, sollevare un errore
  if !user_field_value.nil? && !user_field_value.empty?
    unless predefined_list.include?(user_field_value)
      # Sollevare un errore di validazione che Discourse capirà
      COSA FARE QUI?
    end
  end
end

Al momento ho il seguente codice al posto di “COSA FARE QUI?”:

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

Ma ciò non sembra funzionare.

Se prendo la pagina del profilo e inserisco un valore (giusto o sbagliato), il sistema reagisce prima con “Salvataggio!” seguito immediatamente da “Errore interno del server 500”.

Forse è tutto dovuto al codice sbagliato all’inizio?

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

Qualcuno può aiutarmi o indirizzarmi alla documentazione corretta?

Grazie!

So che con certezza che questo pezzo di codice è ciò che causa l’errore interno del server 500:

C’è qualcuno là fuori che può dirmi come accedere al valore del campo utente di un campo personalizzato?

Altri pezzi di codice che non funzionano:

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

Qualche idea / puntatore alla documentazione o al codice?