如何更改必填字段的错误消息?如果我有类似的东西
@required_fields ~w(name email)
我希望显示“没有办法是空的”而不是默认值“不能为空”?
答案 0 :(得分:5)
我通常会这样定制:
validate_required(changeset, [:email], message: "Email cannot be blank.")
答案 1 :(得分:0)
我认为自发布上一个答案以来,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
请注意,您必须先调用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