Elixir Pheonix 路线无法找到合适的模块/功能(模块不可用)

问题描述 投票:0回答:1

使用默认生成的控制器,我收到以下警告。当我修改添加另一条路线时,我也收到了警告。显然我做错了什么,但从错误消息来看并不明显。

warning: HelloWeb.HelloWeb.PageController.init/1 is undefined (module HelloWeb.HelloWeb.PageController is not available or is yet to be defined)
  lib/hello_web/router.ex:26: HelloWeb.Router.__checks__/0

我的搜索结果表明路由器中使用的控制器模块名称与实际定义的名称之间通常不匹配,但如果是这种情况,我无法检测到差异。

路由器(router.ex)
defmodule HelloWeb.Router do
  alias HelloWeb.PageController
  use HelloWeb, :router

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_live_flash
    plug :put_root_layout, html: {HelloWeb.Layouts, :root}
    plug :protect_from_forgery
    plug :put_secure_browser_headers
    plug :fetch_current_user
  end

  scope "/", HelloWeb do
    pipe_through :browser

    # I should note that this line produces the following warning in VSCode using the Phoenix extension
    # "HelloWeb.HelloWeb.PageController.init/1 is undefined (module HelloWeb.HelloWeb.PageController is not available or is yet to be defined)"
    get "/", PageController, :home
  end
控制器(控制器/page_controller.ex)
defmodule HelloWeb.PageController do
  use HelloWeb, :controller

  def home(conn, _params) do
    # The home page is often custom made,
    # so skip the default app layout.
    render(conn, :home, layout: false)
  end
end

这里对我来说最突出的是,尽管该模块名为

HelloWeb.HelloWeb.PageController
,但警告指的是
HelloWeb.PageController
。我不知道差异的原因,或者即使它与实际问题有关。

  • 为什么这段代码会生成警告?
  • 为什么警告抱怨缺少
    init/1
    功能?
  • 为什么警告中的模块名称比控制器文件中定义的模块名称长?
elixir phoenix-framework
1个回答
0
投票

这与路由器的范围有关。当您执行

scope "/", HelloWeb
时,您的路由器知道在
HelloWeb.
前缀下查找控制器。因此,您不需要为控制器添加别名。通过添加别名,您的路由器将复制模块名称的
HelloWeb
部分,如警告中所示。

所以:

  1. 生成警告是因为路由器由于添加的别名而推断出错误的名称。
  2. init/1
    是生成新进程时调用的函数,因此您的路由器可能尝试在
    HelloWeb.HelloWeb.PageController
    处生成一个模块,但由于该模块不存在于双
    HelloWeb
    中,因此无法找到它并调用其
    init/1
    函数。
  3. 只是因为模块名称的推断方式和别名的存在相结合。
© www.soinside.com 2019 - 2024. All rights reserved.