텍스트 유형 사용자 지정 필드 값을 검증하는 플러그인

사용자가 소속된 프로젝트의 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 Internal Server Error를 유발한다는 것을 확신합니다:

커스텀 필드의 사용자 필드 값에 접근하는 방법을 알려줄 수 있는 사람이 있을까요?

다음은 작동하지 않는 다른 코드 조각들입니다:

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

아이디어나 문서/코드에 대한 힌트가 있을까요?