phoenix: render template of other folder
As of Phoenix 1.5.1
Phoenix matches controllers, views, and templates by names. It can be changed by put_view like:
conn
|> put_view(MyAppWeb.SpecialView)
|> render(:show, message: "Hello")
https://hexdocs.pm/phoenix/Phoenix.Controller.html#render/3-views
For me worked when I specified application name:
web/templates/product_gallery/index.html.eex:
<p>Please, render me!</p>
web/templates/kitchen/index.html.eex:
<%= render APP.ProductGalleryView, "index.html", assigns %>
If I am trying to render without application name I am getting:
undefined function ProductGalleryView.render/2 (module ProductGalleryView is not available)
I'm on Phoenix 1.3.0. Seems like I had to add
alias MyApp.Userview
to web/views/personal_info_view.ex
, then
<%= render conn, UserView, "xyz.html" %>
Without the alias above, then you have to
<%= render conn, MyApp.UserView, "xyz.html" %>
Phoenix templates are just functions, so when you want to render your UserView
's "xyz.html" template from your PersonalInfo
's view, you just call the function!
Let's say you are inside the web/templates/personal_info/show.html.eex
template. (Phoenix.View.render
is already imported for you):
<%= render UserView, "xyz.html", user: user %>
Of if you want to pass along all the template assigns that your PersonalInfo template was provided:
<%= render UserView, "xyz.html", assigns %>
As you found, this works from anywhere, because templates are Just Functions. For example, the same thing would work in iex:
iex> Phoenix.View.render(MyApp.UserView, "xyz.html")
"<h1>User ..."