Phoenix Ecto как справиться с ошибкой NoResultsError

В моем API Phoenix JSON я получаю Ecto NoResultsError, когда запрашиваю объект, которого нет в базе данных.

Я хочу, чтобы мой JSON API возвращал нуль вместе с ошибкой 404.

Как бы я это сделал?

В настоящее время у меня в значительной степени есть сгенерированный по умолчанию контроллер / представления html и т. Д. Я изменил контроллер следующим образом:

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

Связанный:

Настройка пользовательского ответа для исключения в приложении Phoenix


person Josh Petitt    schedule 06.12.2015    source источник


Ответы (2)


Используйте get вместо get! и обрабатывайте логику, когда она возвращает 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  
person NoDisplayName    schedule 07.12.2015

Также можно отловить ошибку, используя 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
person Sajal Sharma    schedule 08.06.2019
comment
Хм. Насколько я понимаю, поток управления исключениями обычно плох в Elixir и больше отнесен к языкам объектно-ориентированного программирования - person engineerDave; 25.10.2020