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