【发布时间】:2017-11-13 16:28:55
【问题描述】:
我正在使用简单的 phoenix elixir 应用程序。在这个应用程序中,我试图公开一个 rest api 来保存和检索数据。
就我而言,如果主键(电子邮件地址)重复,我的应用程序会抛出错误。 我需要知道处理此错误的最佳方法; try-catch 或任何其他更好的解决方案。
这是我的数据保存方法
def post(conn, %{"stooge" => stooge, "name" => name, "email" => email , "password" => password})do
respond = Repo.insert!(%ApiDb.User{name: name, email: email, stooge: stooge, password: password})
json conn, respond
end
样本负载
{
"stooge": "moe",
"name": "Joe",
"email": "p31111ww11eee32111111134@dmain.com",
"password":"asdasd"
}
models/user.ex
defmodule ApiDb.User do
use ApiDb.Web, :model
schema "users" do
field :password, :string
field :name, :string
field :email, :string
field :stooge, :string
timestamps()
end
@doc """
Builds a changeset based on the `struct` and `params`.
"""
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:name, :email, :password, :stooge])
|> validate_required([:name, :email, :password])
|> validate_format(:email, ~r/@/)
end
end
我尝试了 try-catch 块,但没有运气
try do
respond = Repo.insert!(%ApiDb.User{name: name, email: email, stooge: stooge, password: password})
json conn, respond
rescue
e in Ecto.ConstraintError -> IO.puts("An error occurred: ")
end
【问题讨论】:
-
您应该在
ApiDb.User中创建一个changeset函数,按照错误消息的说明将unique_constraint添加到其中,然后在控制器中使用Repo.insert和case来处理错误案子。尝试在全新的应用程序中使用phoenix.gen.json生成模型并研究其来源或阅读phoenixframework.org/docs/ecto-models(尤其是该页面上的case Repo.insert(changeset) do ...)。 -
我有这个模型 defmodule ApiDb.User 使用 ApiDb.Web,:model schema "users" do field :password, :string field :name, :string field :email, :string field :stooge , :string timestamps() end end
-
@Dogbert 你能用我的应用举例指导我吗