【问题标题】:How to add a custom error message for a required field in Phoenix framework如何在 Phoenix 框架中为必填字段添加自定义错误消息
【发布时间】:2019-04-12 15:06:24
【问题描述】:

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

@required_fields ~w(name email)

我想显示“不可能是空的”而不是“不能为空”的默认值?

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    我通常这样自定义:

    validate_required(changeset, [:email], message: "Email cannot be blank.")
    

    【讨论】:

    • 在过去是不可能的。现在就是这样。
    • 这不起作用,错误消息将显示为email Email cannot be blank。您只能更改结尾,并且总是在前面添加字段名称(并且小写)。
    【解决方案2】:

    "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
    

    希望有帮助!

    【讨论】:

    • 硬编码太糟糕了:(大多数人可能会喜欢更改它
    • 你是对的。继续向 Ecto github.com/elixir-lang/ecto/issues/884 添加了一个问题,因此他们添加了一种支持它的方法。
    • 目前这是 I18n 系统正常工作之前的方法。
    • Enum.map 后面缺少一个“)”。我无法自己编辑它,因为它少于 6 个字符。
    • 对在生成的 ErrorHelpers 中使用“def translate_error({msg, opts})”来匹配短语并推出自己的键/消息有任何顾虑吗?
    【解决方案3】:

    我认为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
    

    【讨论】:

      猜你喜欢
      • 2015-05-14
      • 1970-01-01
      • 2023-04-08
      • 2015-05-06
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      相关资源
      最近更新 更多