Plugin to validate a text type custom field value

AI-generated summary

A user, omegerard, is trying to create a plugin to validate a custom user field value (projectid) in Discourse. The goal is to grant access to rich content categories only if the entered projectid is valid. The user has written code to check the custom field value against a predefined list, but is encountering a 500 Internal Server Error when trying to save an invalid value.

The error is caused by the line user_field_value = self.custom_fields[custom_field_key], but the user is struggling to find an alternative way to access the custom field value. They have tried several approaches, including:

  • 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

The user is seeking help and guidance on how to correctly access the custom field value and implement the validation logic.

I have a custom user field to hold the projectid of the project the user is a member of.

Purpose: a user that enters a valid (paying) projectid has access to rich content categories.

Checking whether the projectid entered by the user corresponds to an existing projectid is fairly easy:

# Define the method to check the custom field
def validate_projectid_customfield
  # Custom field key and predefined list
  custom_field_key = 'projectid'
  predefined_list = ["558", "963", "819"]
  
  # Get the user's custom field value
  user_field_value = self.custom_fields[custom_field_key]

  # If the value is not in the predefined list, raise an error
  if !user_field_value.nil? && !user_field_value.empty?
    unless predefined_list.include?(user_field_value)
      # Raise a validation error that Discourse will understand
      WHAT TO DO HERE?  
    end
  end
end

At the moment I have the following code in place of ‘WHAT TO DO HERE?’

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

But that does not seem to work.

If I take the profile page and fill in a value (right or wrong) the system first reacts with “Saved!” immediately followed by “500 Internal Server Error”.

Maybe it is all due the wrong code at the start?

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

Can anyone help me out or direct me to the right documentation?

Thanks!

I know for sure that this piece of code is what causes the 500 Internal Server Error:

Is there anybody out there who can tell me how to get at the user field value of a custom field?

Other peices poeces of code that aren’t workijg either:

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

Any ideas / pointers to documentation pr code?