首页 > 解决方案 > 如何从 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/templateslib/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_iodataas

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: "**/*"
...

但感觉很奇怪,为什么它之前使用没有**/*模式的命名空间工作,而当我删除命名空间时它停止工作?

标签: elixirphoenix-framework

解决方案


推荐阅读