2015-09-25 3 views
10

У меня есть две папки шаблона в моем вебе-папке/шаблонах:феникс воздай шаблон другой папки

> 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 

Пожалуйста, скажите мне, как я сделать шаблон, задаваемый в другую папку, я попытался несколько перестановок, но никто не работал.

ответ

20

Шаблоны Phoenix - это просто функции, поэтому, когда вы хотите отобразить свой шаблон «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 ..." 
+1

На Phoenix 1.3.0, у меня было добавить 'alias MyApp.UserView' в' web/views/personal_info_view.ex', иначе он скажет '(модуль UserView недоступен' – owyongsk

1

Видимо следующие работали:

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

пожалуйста, дайте мне знать, если есть лучшие альтернативы.

Источник: this.

1

Для меня работал, когда я указал имя приложения:

веб/шаблоны/product_gallery/index.html.eex:

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

web/templates/kitchen/index.html.eex:

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

Если я пытаюсь сделать без имени приложения, я получаю ting:

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

I n ваши 'lib/web/views/kitchen_view.ex', вы также можете добавить' alias APP.ProductGalleryView', чтобы вы могли просто использовать рендеринг ProductGalleryView – owyongsk

0

Я нахожусь на Phoenix 1.3.0.Похоже, я должен был добавить

alias MyApp.Userview 

к web/views/personal_info_view.ex, затем

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

Без выше псевдонима, то вы должны

<%= render conn, MyApp.UserView, "xyz.html" %>  
Смежные вопросы