elixir - 如何从 Elixir Phoenix 应用程序中删除命名空间?
问题描述
Elixir Phoenix 为控制器、模型和视图添加了命名空间的前缀。就我而言,它是CableWeb
,因为我的应用程序称为Cable
.
我想删除它,因为我的应用程序很小,并且在没有命名空间的情况下更容易使用。
我试图删除它,并重写下面的代码
scope "/", CableWeb do
pipe_through :browser
get "/", PageController, :index
end
...
defmodule CableWeb.PageController do
use CableWeb, :controller
def index(conn, _params) do
render(conn, "index.html")
end
end
...
defmodule CableWeb.PageView do
use CableWeb, :view
end
作为
scope "/" do
pipe_through :browser
get "/", PageController, :index
end
...
defmodule PageController do
use CableWeb, :controller
def index(conn, _params) do
render(conn, "index.html")
end
end
...
defmodule PageView do
use CableWeb, :view
end
我还删除了该lib/cable_web
文件夹并将其内容移动到lib
并将模板根路径从 更新lib/cable_web/templates
为lib/templates
. 我还在代码库中搜索了namespace
关键字并将其删除。
它工作正常,除了模板。
如果我将模板放入templates/index.html.eex
并将其渲染为render(conn, "index.html")
templates/page/index.html.eex
但是,如果我将它放入并将其渲染为render(conn, "page/index.html")
或 as ,它将不起作用render(conn, "/page/index.html")
。
Could not render "/page/index.html" for PageView, please define a matching clause for render/2 or define a template at "lib/templates/*". The following templates were compiled
我可以看到它正确找到PageView
并传递给render_to_iodata
as
Phoenix.View.render_to_iodata(PageView, "page/index.html", assing)
好像凤凰没有编译lib/templates/page/index.html.eex
模板。它查找没有子文件夹lib/templates/*
但不在子文件夹中的模板lib/templates/**/*
。
更新
pattern
我终于通过添加选项来使它工作Cable.view
...
use Phoenix.View, root: "lib/templates", pattern: "**/*"
...
但感觉很奇怪,为什么它之前使用没有**/*
模式的命名空间工作,而当我删除命名空间时它停止工作?
解决方案
推荐阅读
- android - Flutter JIT 编译和动态小部件树
- r - 如何根据R中的条件创建新列
- kotlin - Koltin:类实现 Serializable 时类型不匹配
- javascript - 如何在 javaScript 中为 Kendo 组合框设置 Selected 值
- javascript - JS:如何从数组中选择随机的项目对
- c# - 使用 Dapper、.NET Core 和 Postgres 的映射不正确
- git - 无法从 azure devops 中提取代码(要求输入密码)
- angular - 我想从一个组件打开对话框并在 3 秒后将其关闭,但出现错误。我遵循 Angular Material UI 文档,但没有任何效果
- python - 如何有效地遍历大量字典引用?
- firebase - Raspberry pi 与云 Firestore 的集成