如何在 Phoenix 框架中为必填字段添加自定义错误消息
How to add a custom error message for a required field in Phoenix framework
如何更改必填字段的错误消息?如果我有类似的东西
@required_fields ~w(name email)
我想显示 "no way it's empty" 而不是默认值 "can't be blank" ?
"can't be blank"
错误消息目前被硬编码到 Ecto 中。但是,您可以通过执行以下操作来替换此错误消息:
def changeset(model, params \ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
|> required_error_messages("no way it's empty")
end
def required_error_messages(changeset, new_error_message) do
update_in changeset.errors, &Enum.map(&1, fn
{key, "can't be blank"} -> {key, new_error_message}
{_key, _error} = tuple -> tuple
end)
end
希望对您有所帮助!
我通常这样定制:
validate_required(changeset, [:email], message: "Email cannot be blank.")
我认为 Ecto.Changeset
自发布上一个答案以来可能已经改变。从 ecto_sql
3.1 开始,%Ecto.Changeset{}
结构存储这样的错误:
errors: [address1: {"can't be blank", [validation: :required]}]
所以我不得不稍微改变一下之前解决方案的结构。在此示例中,我使用 cast/4 来转换原始映射(第一个参数可以是变更集或数据元组,如 {data, types}
):
@permitted [:name, :phone, :url]
@parameter_types %{name: :string, phone: :string, url: :string}
def signup_changeset(params) do
IO.inspect params
cast({%{}, @parameter_types}, params, @permitted)
|> validate_required([:name, :phone, :url])
|> required_error_messages("no way it's empty")
end
defp required_error_messages(changeset, new_error_message) do
update_in changeset.errors, &Enum.map(&1, fn
{key, {"can't be blank", rules}} -> {key, {new_error_message, rules}}
tuple -> tuple
end)
end
请注意,在获得任何默认 "can't be blank" 字符串之前,您必须先调用 validate_required
。
或者,您可以为每个违规字段详细设置错误消息:
@permitted [:name, :phone, :url]
@parameter_types %{name: :string, phone: :string, url: :string}
def signup_changeset(params) do
cast({%{}, @parameter_types}, params, @permitted)
|> validate_required(:name, message: "Dude. You need an address.")
|> validate_required(:phone, message: "You must have a name.")
|> validate_required(:url, message: "We need a valid URL for your homepage.")
end
如何更改必填字段的错误消息?如果我有类似的东西
@required_fields ~w(name email)
我想显示 "no way it's empty" 而不是默认值 "can't be blank" ?
"can't be blank"
错误消息目前被硬编码到 Ecto 中。但是,您可以通过执行以下操作来替换此错误消息:
def changeset(model, params \ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
|> required_error_messages("no way it's empty")
end
def required_error_messages(changeset, new_error_message) do
update_in changeset.errors, &Enum.map(&1, fn
{key, "can't be blank"} -> {key, new_error_message}
{_key, _error} = tuple -> tuple
end)
end
希望对您有所帮助!
我通常这样定制:
validate_required(changeset, [:email], message: "Email cannot be blank.")
我认为 Ecto.Changeset
自发布上一个答案以来可能已经改变。从 ecto_sql
3.1 开始,%Ecto.Changeset{}
结构存储这样的错误:
errors: [address1: {"can't be blank", [validation: :required]}]
所以我不得不稍微改变一下之前解决方案的结构。在此示例中,我使用 cast/4 来转换原始映射(第一个参数可以是变更集或数据元组,如 {data, types}
):
@permitted [:name, :phone, :url]
@parameter_types %{name: :string, phone: :string, url: :string}
def signup_changeset(params) do
IO.inspect params
cast({%{}, @parameter_types}, params, @permitted)
|> validate_required([:name, :phone, :url])
|> required_error_messages("no way it's empty")
end
defp required_error_messages(changeset, new_error_message) do
update_in changeset.errors, &Enum.map(&1, fn
{key, {"can't be blank", rules}} -> {key, {new_error_message, rules}}
tuple -> tuple
end)
end
请注意,在获得任何默认 "can't be blank" 字符串之前,您必须先调用 validate_required
。
或者,您可以为每个违规字段详细设置错误消息:
@permitted [:name, :phone, :url]
@parameter_types %{name: :string, phone: :string, url: :string}
def signup_changeset(params) do
cast({%{}, @parameter_types}, params, @permitted)
|> validate_required(:name, message: "Dude. You need an address.")
|> validate_required(:phone, message: "You must have a name.")
|> validate_required(:url, message: "We need a valid URL for your homepage.")
end