phoenix: 其他文件夹的渲染模板
phoenix: render template of other folder
我的 web/templates 文件夹中有两个模板文件夹:
> ls web/templates
personal_info user
我想要的是在 personal_info
的另一个视图中呈现 user
文件夹中的一些模板。所以我在路径上有一个文件: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
请告诉我如何呈现在其他文件夹中定义的模板,我尝试了一些排列,但 none 有效。
显然以下有效:
<%= Phoenix.View.render(MyApp.UserView, "xyz.html") %>
如果有更好的选择,请告诉我。
来源:this.
Phoenix 模板只是函数,所以当您想从 PersonalInfo
的视图中呈现 UserView
的 "xyz.html" 模板时,只需调用该函数即可!
假设您在 web/templates/personal_info/show.html.eex
模板中。 (Phoenix.View.render
已经为您导入):
<%= render UserView, "xyz.html", user: user %>
如果您想传递所有模板分配,您的 PersonalInfo 模板已提供:
<%= render UserView, "xyz.html", assigns %>
如您所见,这适用于任何地方,因为模板只是函数。例如,同样的事情会在 iex:
中起作用
iex> Phoenix.View.render(MyApp.UserView, "xyz.html")
"<h1>User ..."
对我来说,当我指定应用程序名称时工作:
web/templates/product_gallery/index.html.eex:
<p>Please, render me!</p>
web/templates/kitchen/index.html.eex:
<%= render APP.ProductGalleryView, "index.html", assigns %>
如果我尝试在没有应用程序名称的情况下进行渲染,我会得到:
undefined function ProductGalleryView.render/2 (module ProductGalleryView is not available)
我正在使用 Phoenix 1.3.0。好像我必须添加
alias MyApp.Userview
至web/views/personal_info_view.ex
,然后
<%= render conn, UserView, "xyz.html" %>
没有上面的别名,那你就得
<%= render conn, MyApp.UserView, "xyz.html" %>
凤凰城 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
我的 web/templates 文件夹中有两个模板文件夹:
> ls web/templates
personal_info user
我想要的是在 personal_info
的另一个视图中呈现 user
文件夹中的一些模板。所以我在路径上有一个文件: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
请告诉我如何呈现在其他文件夹中定义的模板,我尝试了一些排列,但 none 有效。
显然以下有效:
<%= Phoenix.View.render(MyApp.UserView, "xyz.html") %>
如果有更好的选择,请告诉我。
来源:this.
Phoenix 模板只是函数,所以当您想从 PersonalInfo
的视图中呈现 UserView
的 "xyz.html" 模板时,只需调用该函数即可!
假设您在 web/templates/personal_info/show.html.eex
模板中。 (Phoenix.View.render
已经为您导入):
<%= render UserView, "xyz.html", user: user %>
如果您想传递所有模板分配,您的 PersonalInfo 模板已提供:
<%= render UserView, "xyz.html", assigns %>
如您所见,这适用于任何地方,因为模板只是函数。例如,同样的事情会在 iex:
中起作用iex> Phoenix.View.render(MyApp.UserView, "xyz.html")
"<h1>User ..."
对我来说,当我指定应用程序名称时工作:
web/templates/product_gallery/index.html.eex:
<p>Please, render me!</p>
web/templates/kitchen/index.html.eex:
<%= render APP.ProductGalleryView, "index.html", assigns %>
如果我尝试在没有应用程序名称的情况下进行渲染,我会得到:
undefined function ProductGalleryView.render/2 (module ProductGalleryView is not available)
我正在使用 Phoenix 1.3.0。好像我必须添加
alias MyApp.Userview
至web/views/personal_info_view.ex
,然后
<%= render conn, UserView, "xyz.html" %>
没有上面的别名,那你就得
<%= render conn, MyApp.UserView, "xyz.html" %>
凤凰城 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