刚开始使用Phoenix时,我生成了项目并运行phoenix.gen.json Todo todos description:string
/lib/test_web/router.ex
# Other scopes may use custom stacks.
scope "/api", TestWeb do
pipe_through :api
resources "/todos", TodoController, except: [:new, :edit]
end
/web/controllers/todo_controller.ex
defmodule Test.TodoController do
use Test.Web, :controller
alias Test.Todo
def index(conn, _params) do
todos = Repo.all(Todo)
render(conn, "index.json", todos: todos)
end
end
到/ api / todos的GET给出500-**(UndefinedFunctionError)函数TestWeb.TodoController.init / 1是未定义的(模块TestWeb.TodoController不可用)
答案 0 :(得分:1)
您的路由器和控制器期望控制器使用两个不同的父模块。您让路由器在“ TestWeb”(请参见范围)下查找控制器,但是您的控制器说它是“ Test.TestController”而不是“ TestWeb.TestController”。
一种解决方案是将scope "/api", TestWeb do
更改为scope "/api", Test do
。
另一种选择是将defmodule Test.TodoController do
更改为defmodule TestWeb.TodoController do
。
这实际上是一个优先事项(尽管遵循生成器的约定可能很好)。
答案 1 :(得分:0)
使用相同版本的生成器(phx.gen.json)。原来的生成器正在定义超出项目范围的模块。
切换到新的发电机后工作。