Маршрут к контроллеру, который выбирает из базы данных и возвращает результаты в ответе 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, так как раньше никогда не создавал такие маршруты.
Вы следуете примеру? Если так, то, что это?