Phoenix Ecto 如何处理 NoResultsError
Phoenix Ecto how to handle NoResultsError
在我的 Phoenix JSON API 中,当我请求数据库中不存在的对象时出现 Ecto NoResultsError。
我希望我的 JSON API 到 return 一个 null 以及一个 404 错误。
我该怎么做?
目前我几乎有一个默认生成的 html controller/views 等。我已经像这样修改了控制器:
def show(conn, %{"id" => id}) do
my_model = Repo.get!(MyModel, id)
case get_format(conn) do
"json" ->
render(conn, my_model: my_model)
_ ->
render(conn, "show.html", my_model: my_model)
end
end
连同视图:
defmodule MyProject.MyModelView do
use Laired.Web, :view
def render("show.json", %{my_model: my_model}) do
my_model
end
end
相关:
使用get
代替get!
并处理returns时的逻辑nil
:
def show(conn,%{"id" => id}) do
case Repo.get(MyModel, id) do
nil -> # return null and 404
record -> # do something with record
end
end
也可以使用 try, rescue
捕获错误
def show(conn,%{"id" => id}) do
try do
result =
Repo.get!(MyModel, id)
{:ok, result}
rescue
Ecto.NoResultsError ->
{:error, :not_found, "No result found"}
end
end
在我的 Phoenix JSON API 中,当我请求数据库中不存在的对象时出现 Ecto NoResultsError。
我希望我的 JSON API 到 return 一个 null 以及一个 404 错误。
我该怎么做?
目前我几乎有一个默认生成的 html controller/views 等。我已经像这样修改了控制器:
def show(conn, %{"id" => id}) do
my_model = Repo.get!(MyModel, id)
case get_format(conn) do
"json" ->
render(conn, my_model: my_model)
_ ->
render(conn, "show.html", my_model: my_model)
end
end
连同视图:
defmodule MyProject.MyModelView do
use Laired.Web, :view
def render("show.json", %{my_model: my_model}) do
my_model
end
end
相关:
使用get
代替get!
并处理returns时的逻辑nil
:
def show(conn,%{"id" => id}) do
case Repo.get(MyModel, id) do
nil -> # return null and 404
record -> # do something with record
end
end
也可以使用 try, rescue
捕获错误
def show(conn,%{"id" => id}) do
try do
result =
Repo.get!(MyModel, id)
{:ok, result}
rescue
Ecto.NoResultsError ->
{:error, :not_found, "No result found"}
end
end