Маршрут к контроллеру, который выбирает из базы данных и возвращает результаты в ответе http

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

в router.ex:

  get "/categories/" do
    [controller] = ["repo"]
    Api.Repo.getCategories(conn, controller)
  end

в repo.ex:

  def getCategories(conn, controller) do
    conn
    start_link
    categories = Api.Category |> all
    |> put_resp_content_type("application/json")
    |> send_resp(200, categories)
  end

Api.Category.ex

defmodule Api.Category do
  use Ecto.Schema

  schema "categories" do
    field :name, :string
  end

  def changeset(category, params \\ %{}) do
    category
    |> Ecto.Changeset.cast(params, [:name])
    |> Ecto.Changeset.validate_required([:name])
  end
end

Я получаю эти предупреждения и ошибки:

warning: variable conn in code block has no effect as it is never returned (remove the variable or a
ssign it to _ to avoid warnings)
  lib/api/repo.ex:174

warning: variable "start_link" does not exist and is being expanded to "start_link()", please use pa
rentheses to remove the ambiguity or change the variable name
  lib/api/repo.ex:175

warning: variable "categories" does not exist and is being expanded to "categories()", please use pa
rentheses to remove the ambiguity or change the variable name
  lib/api/repo.ex:178

warning: variable "controller" is unused
  lib/api/repo.ex:173

warning: variable "categories" is unused
  lib/api/repo.ex:176


== Compilation error on file lib/api/repo.ex ==
** (CompileError) lib/api/repo.ex:178: undefined function categories/0
    (stdlib) lists.erl:1338: :lists.foreach/2
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6

Похоже, я использую categories, Что я делаю неправильно?

1 ответ

Решение

Ваша ошибка вызвана

categories = Api.Category |> all
|> put_resp_content_type("application/json")
|> send_resp(200, categories)

Это один конвейер, который назначен категориям. Итак, категории в send_resp(200, categories) не установлен.

Чтобы было понятно, это еще один способ написать тот же код:

categories = 
  Api.Category 
  |> all
  |> put_resp_content_type("application/json")
  |> send_resp(200, categories)

Кроме того, conn а также start_link неуместны. conn ничего не делает, и start_link обычно возвращает pid, который потерян.

Я считаю, что вы пытались что-то вроде:

  categories = all Api.Category
  conn
  |> put_resp_content_type("application/json")
  |> send_resp(200, categories)

Целые примеры выглядят странно. Я никогда не видел такого рода вещи в модуле репо. Как правило, вы найдете это в контроллере. Я не могу комментировать файл route.ex, так как раньше никогда не создавал такие маршруты.

Вы следуете примеру? Если так, то, что это?

Другие вопросы по тегам