使用默认生成的控制器,我收到以下警告。当我修改添加另一条路线时,我也收到了警告。显然我做错了什么,但从错误消息来看并不明显。
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
? - 为什么警告中的模块名称比控制器文件中定义的模块名称长?
编辑:基于下面有用的解决方案,我发现 VSCode ElixirLS 扩展会在需要时默认插入别名,这会破坏 Phoenix 处理路由的方式。可以在扩展设置中禁用此功能:
缺点是禁用此功能似乎会破坏自动完成功能。