如何在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
相关产品推荐
相关产品推荐

