gpt4 book ai didi

elixir - 翻译 Ecto 验证消息

转载 作者:行者123 更新时间:2023-12-05 04:10:37 26 4
gpt4 key购买 nike

我的 Phoenix 应用程序中有以下架构:

defmodule TattooBackend.Accounts.Account do
@moduledoc """
Contains schema and changesets for Account resource.
"""

use Ecto.Schema

import Ecto.Changeset

alias TattooBackend.Accounts.Account

schema "accounts" do
field :email, :string
field :crypted_password, :string
field :password, :string, virtual: true
timestamps()
end

def changeset(%Account{} = user, attributes \\ %{}) do
user
|> cast(attributes, [:email, :password])
|> validate_required([:email, :password])
|> validate_length(:password, min: 6)
|> validate_format(:email, ~r/([\w-\.]+)@((?:[\w]+\.)+)([a-zA-Z]{2,4})/)
|> unique_constraint(:email, name: "accounts_lower_email_index")
|> put_password_hash
end

defp put_password_hash(changeset) do
case changeset do
%Ecto.Changeset{valid?: true, changes: %{password: pass}} ->
put_change(changeset, :crypted_password, Comeonin.Bcrypt.hashpwsalt(pass))
_ ->
changeset
end
end
end

我写了简单的测试:

defmodule TattooBackend.Accounts.AccountTest do
use TattooBackend.DataCase, async: true

alias TattooBackend.Repo
alias TattooBackend.Accounts.Account

describe "with invalid attributes" do
setup do
changeset = Account.changeset(%Account{})

{:ok, %{changeset: changeset}}
end

test "changeset is inalid", %{changeset: changeset} do
refute changeset.valid?
end

test "changeset have errors", %{changeset: changeset} do
assert changeset.errors == [
email: {"can't be blank", [validation: :required]},
password: {"can't be blank", [validation: :required]},
]
end
end
end

现在我的问题是如何翻译这些 Ecto 验证消息?

最佳答案

您可以枚举您的错误并使用 Gettext 来翻译它们。例如

def translate_error(%{errors: errors}=_changeset) do
Enum.map(errors, fn {field, error} ->
Atom.to_string(field) <> " " <> translate_error(error)
end)
end
def translate_error({msg, opts}) do
case opts[:count] do
nil -> Gettext.dgettext(TattooBackendWeb.Gettext, "errors", msg, opts)
count -> Gettext.dngettext(TattooBackendWeb.Gettext, "errors", msg, msg, count, opts)
end
end

这应该打印出如下内容:

["email has already been taken", "password can't be blank"]

希望对您有所帮助!

关于elixir - 翻译 Ecto 验证消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44183906/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com