如何在Phoenix框架中为必填字段添加自定义错误消息

时间:2015-08-16 05:51:36

标签: elixir phoenix-framework

如何更改必填字段的错误消息?如果我有类似的东西

@required_fields ~w(name email)

我希望显示“没有办法是空的”而不是默认值“不能为空”?

2 个答案:

答案 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