使用默认生成的控制器,我收到以下警告。当我修改添加另一条路线时,我也收到了警告。显然我做错了什么,但从错误消息来看并不明显。
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
我的搜索结果表明路由器中使用的控制器模块名称与实际定义的名称之间通常不匹配,但如果是这种情况,我无法检测到差异。
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
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
功能?这与路由器的范围有关。当您执行
scope "/", HelloWeb
时,您的路由器知道在 HelloWeb.
前缀下查找控制器。因此,您不需要为控制器添加别名。通过添加别名,您的路由器将复制模块名称的 HelloWeb
部分,如警告中所示。
所以:
init/1
是生成新进程时调用的函数,因此您的路由器可能尝试在 HelloWeb.HelloWeb.PageController
处生成一个模块,但由于该模块不存在于双 HelloWeb
中,因此无法找到它并调用其 init/1
函数。