# 用于验证文本类型自定义字段值的插件

**URL:** https://meta.discourse.org/t/plugin-to-validate-a-text-type-custom-field-value/325534
**Category:** Development
**Created:** [2024年九月8日 19:36 UTC](https://meta.discourse.org/t/plugin-to-validate-a-text-type-custom-field-value/325534 "2024-09-08T19:36:29Z")
**Posts on this page:** 2
**Page:** 1

<div class="post-metadata">

### Author: ![omegerard](https://avatars.discourse-cdn.com/v4/letter/o/f9ae1b/32.png) [@omegerard](https://meta.discourse.org/u/omegerard)
#### Post date: [2024年九月8日 19:36 UTC](https://meta.discourse.org/t/plugin-to-validate-a-text-type-custom-field-value/325534/1 "2024-09-08T19:36:30Z")

</div>

我有一个自定义用户字段，用于存储用户所属项目的 projectid。

目的：输入有效（付费）projectid 的用户可以访问丰富的内​​容类别。

检查用户输入的 projectid 是否对应现有 projectid 相当容易：

```plaintext
# 定义检查自定义字段的方法
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？”处使用了以下代码：

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

```

但这似乎不起作用。

如果我进入个人资料页面并输入一个值（正确或错误），系统会先立即显示“已保存！”，然后显示“500 内部服务器错误”。

也许这一切都归咎于开头的错误代码？

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

```

有人能帮帮我或指引我到正确的文档吗？

谢谢！

---

<div class="post-metadata">

### Author: ![omegerard](https://avatars.discourse-cdn.com/v4/letter/o/f9ae1b/32.png) [@omegerard](https://meta.discourse.org/u/omegerard)
#### Post date: [2024年九月9日 19:40 UTC](https://meta.discourse.org/t/plugin-to-validate-a-text-type-custom-field-value/325534/2 "2024-09-09T19:40:17Z")

</div>

我确信是这段代码导致了500内部服务器错误：

> [@omegerard](#):
>
> `user_field_value = self.custom_fields[custom_field_key]`

有人能告诉我如何获取自定义字段的用户字段值吗？

其他不起作用的代码片段：

```plaintext
custom_field_value = self.user.reload.custom_fields[custom_field_key]

```

```plaintext
custom_field_value = UserCustomField.where(user_id: self.user.id, name: custom_field_key).pluck(:value).first

```

有什么想法/文档或代码链接吗？
