凤凰:渲染其他文件夹的模板

时间:2015-09-25 14:04:38

标签: templates web-deployment elixir phoenix-framework

我的web / templates文件夹中有两个模板文件夹:

> ls web/templates
personal_info       user

我想要的是在另一个user视图中从personal_info文件夹中呈现一些模板。所以我在路径上有一个文件:web/templates/personal_info/index.html.eex,我有以下内容:

<%= render "user/xyz.html" %>

但我得到以下错误:

[error] #PID<0.821.0> running MyApp.Endpoint terminated
Server: localhost:4000 (http)
Request: GET /
** (exit) an exception was raised:
    ** (Phoenix.Template.UndefinedError) Could not render "user/xyz.html" for MyApp.PersonalInfoView, please define a matching clause for render/1 or define a template at "web/templates/personal_info". The following templates were compiled:

* index.html

请告诉我如何渲染在其他文件夹中定义的模板,我尝试了几种排列,但都没有效果。

5 个答案:

答案 0 :(得分:30)

凤凰模板只是功能,因此当您想要呈现UserView&#34; xyz.html&#34;您PersonalInfo视图中的模板,您只需调用该函数!

我们假设您在web/templates/personal_info/show.html.eex模板中。 (Phoenix.View.render已经为您导入):

<%= render UserView, "xyz.html", user: user %>

如果您想传递提供PersonalInfo模板的所有模板分配:

<%= render UserView, "xyz.html", assigns %>

正如您所发现的,这可以在任何地方使用,因为模板是Just Functions。例如,同样的事情在iex中起作用:

iex> Phoenix.View.render(MyApp.UserView, "xyz.html")
"<h1>User ..."

答案 1 :(得分:1)

显然跟随工作:

<%=  Phoenix.View.render(MyApp.UserView, "xyz.html") %>

请告诉我,如果有更好的选择。

来源:this

答案 2 :(得分:1)

当我指定应用程序名称时,对我工作:

网/模板/ product_gallery / index.html.eex:

<p>Please, render me!</p>

网/模板/厨房/ index.html.eex:

<%= render APP.ProductGalleryView, "index.html", assigns %>

如果我试图在没有应用程序名称的情况下进行渲染,我会得到:

undefined function ProductGalleryView.render/2 (module ProductGalleryView is not available)

答案 3 :(得分:1)

我在Phoenix 1.3.0上。好像我不得不添加

alias MyApp.Userview

web/views/personal_info_view.ex,然后

<%= render conn, UserView, "xyz.html" %>

如果没有上面的别名,那么你必须

<%= render conn, MyApp.UserView, "xyz.html" %>    

答案 4 :(得分:1)

凤凰城1.5.1

Phoenix按名称匹配控制器,视图和模板。可以通过put_view进行更改,例如:

conn
  |> put_view(MyAppWeb.SpecialView)
  |> render(:show, message: "Hello")

https://hexdocs.pm/phoenix/Phoenix.Controller.html#render/3-views