我最近开始与Elixir / Phonix (喜欢它)一起工作,我想了解'Magic'路径(正如我所指)的工作方式以及为Phoenix自动配置了哪些路径以及它们指向的位置。
通过“魔术”路径,我指的是这样的代码:
to: activity_path(@conn, :index)
或to: user_path(@conn, :update)
或static_path(@conn, "/js/bootstrap.min.js")
。
看来我可以对我创建的任何控制器模块使用“ Magic”路径,即
defModule MyWeb.HoobitzController do
...
end
所以我可以使用hoobitz_path()
在HoobitzController中调用一个函数。
这仅适用于控制器吗?是按控制器名称还是控制器的文件名命名?
static_path()
显然指向Web根目录的/priv
目录,我假设是Phoenix核心以某种神秘的方式建立了此引用。是否还有其他“魔术”路径指向网络根目录中的其他位置?如果是这样,它们是什么,它们指向何处?
最后,这些“魔术”路径是否有“真实”名称?社区指的是用什么术语来指代他们?
答案 0 :(得分:0)
对于static_path()
,您已经正确回答了自己的问题。
对于您所说的魔术路径,它们来自您的lib/yourapp_web/router.ex
文件,并可能在命令行中与mix phx.routes
任务一起列出。我相信它们被称为“路线”。
您可以检查其在Phoenix code中的构造方式。
答案 1 :(得分:0)
static_path和Plug.Static
static_path/1
是在Phoenix.Endpoint行为中定义的回调函数。查看您的YOUAPP.Endpoint
模块内部,在模块顶部有“ use Phoenix.Endpoint,otp_app::your_app_web`”。当您查看source code for static_path/1时,它实际上返回默认的“ /”脚本路径的值。
基本上,Phoenix只为您生成路径,并且不知道您的Web应用程序 / priv 目录的位置。
在您的Endpoint模块中,应该有一段代码如下:
plug Plug.Static,
at: "/", from: :tokenix_admin_web, gzip: false,
only: ~w(css fonts images js favicon.ico robots.txt)
关键字from
为
the file system path to read static assets from. It can be either: a string containing a file system path, an
atom representing the application name (where assets will
be served from `priv/static`), or a tuple containing the
application name and the directory to serve assets from (besides `priv/static`).
当有对“ /”路径的请求时,Plug.Static模块是为私有/静态内容提供服务的模块。
Phoenix.Router.Helpers
魔术路径或生成的路径来自Phoenix.Router.Helpers模块。
在Phoenix.Router编译之前,它将define helpers function first。它读取您的路由定义,然后将其传递到将基于控制器名称生成的Phoenix.Router.Helpers.define/2中。
Helpers are automatically generated based on the controller name.
For example, the route:
get "/pages/:page", PageController, :show
will generate the following named helper:
MyAppWeb.Router.Helpers.page_path(conn_or_endpoint, :show, "hello")
"/pages/hello"
MyAppWeb.Router.Helpers.page_path(conn_or_endpoint, :show, "hello", some: "query")
"/pages/hello?some=query"
MyAppWeb.Router.Helpers.page_url(conn_or_endpoint, :show, "hello")
"http://example.com/pages/hello"
MyAppWeb.Router.Helpers.page_url(conn_or_endpoint, :show, "hello", some: "query")
"http://example.com/pages/hello?some=query"
它使用对generate helper_path code的元编程。
因此,真实姓名是助手路径。
您应该查看您的 YourApp , YourApp.Application” , YourApp.Endpoint 和 YourApp.Router 模块。Phoenix通常会明确定义配置。