Phoenix: сделать шаблон другой папки
У меня есть папка с двумя шаблонами в моей папке 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
Скажите, пожалуйста, как мне отобразить шаблон, определенный в другой папке, я пробовал несколько перестановок, но никто не работал.
Ответы
Ответ 1
Шаблоны Phoenix - это просто функции, поэтому, когда вы хотите отобразить свой UserView
"xyz.html" шаблон из вашего представления PersonalInfo
, вы просто вызываете функцию!
Скажем, вы находитесь внутри шаблона 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 ..."
Ответ 2
По-видимому, после работы:
<%= Phoenix.View.render(MyApp.UserView, "xyz.html") %>
пожалуйста, дайте мне знать, если есть лучшие альтернативы.
Источник: this.
Ответ 3
Для меня работало, когда я указал имя приложения:
веб/шаблоны/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)
Ответ 4
Я на Phoenix 1.3.0. Похоже, мне пришлось добавить
alias MyApp.Userview
до web/views/personal_info_view.ex
, то
<%= render conn, UserView, "xyz.html" %>
Без псевдонима выше, вы должны
<%= render conn, MyApp.UserView, "xyz.html" %>