【问题标题】:Controller undefined after generation生成后未定义控制器
【发布时间】:2018-08-11 12:59:58
【问题描述】:

刚开始使用 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 不可用)

【问题讨论】:

  • 控制器模块不应该命名为TestWeb.TodoController吗?
  • @mudasobwa 同样的错误
  • 您已经在路由器中明确限制POST 使用此网址,您为什么期望它可以工作?
  • @mudasobwa GET 不起作用,因为控制器未定义
  • 如何运行应用程序?

标签: elixir phoenix


【解决方案1】:

您的路由器和控制器需要两个不同的父模块用于您的控制器。您让路由器在“TestWeb”下寻找控制器(参见范围),但您的控制器说它是“Test.TestController”而不是“TestWeb.TestController”。

一种解决方案是将scope "/api", TestWeb do 更改为scope "/api", Test do

另一种选择是将defmodule Test.TodoController do 更改为defmodule TestWeb.TodoController do

这确实是一个偏好问题(尽管遵守生成器的约定可能会很好)。

【讨论】:

    【解决方案2】:

    使用相同的现代版本的生成器 (phx.gen.json)。旧生成器正在定义项目范围之外的模块。

    切换到新生成器后工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      • 2015-08-03
      • 1970-01-01
      • 2016-11-15
      相关资源
      最近更新 更多