You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Phoenix与Ecto中验证字符串是否为合法UUID?

验证UUID合法性的实现方案(Phoenix + Ecto)

Ecto.UUID本身没有提供直接的验证函数,但可以利用它的cast/1方法判断字符串是否为合法UUID——该函数会尝试将输入转换为UUID格式,成功则返回{:ok, uuid},失败返回:error,基于这个特性可以实现验证逻辑。

场景1:在Schema Changeset中验证字段

如果需要在模型的changeset里验证某个UUID字段,可自定义验证函数:

defmodule MyApp.User do
  use Ecto.Schema
  import Ecto.Changeset

  schema "users" do
    field :external_id, Ecto.UUID
  end

  def changeset(user, attrs) do
    user
    |> cast(attrs, [:external_id])
    |> validate_uuid(:external_id)
  end

  defp validate_uuid(changeset, field) do
    validate_change(changeset, field, fn _, value ->
      case Ecto.UUID.cast(value) do
        {:ok, _} -> []
        :error -> [{field, "必须是合法的UUID格式"}]
      end
    end)
  end
end

场景2:单独验证任意字符串

如果只是需要单独检查某个字符串是否为合法UUID,可以封装一个工具函数:

defmodule MyApp.UUIDValidator do
  @doc "检查输入字符串是否为合法UUID"
  def valid?(value) when is_binary(value) do
    case Ecto.UUID.cast(value) do
      {:ok, _} -> true
      :error -> false
    end
  end

  def valid?(_), do: false
end

使用时直接调用MyApp.UUIDValidator.valid?("550e8400-e29b-41d4-a716-446655440000")即可得到布尔结果。

注:相比自己写正则表达式,使用Ecto.UUID.cast/1更可靠,它会自动处理UUID的版本规则、大小写兼容等细节。

内容的提问来源于stack exchange,提问作者Marco C. Stewart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 17:47:13