Дополнительные параметры компоновки Phoenix, такие как @inner

Я хочу добавить дополнительные параметры макета, такие как @inner для макета. Например @title для <title>@title</title> и область для javascript onload для отдельных страниц.

window.onload = function () {
   @onload_js
}

Они установлены в макете, поэтому я не уверен, что лучше всего их обработать в Phoenix. Спасибо: D.

Ответ 1

Для заголовка страницы вы можете просто передать значение через контроллер:

def edit(conn, params) do
  render(conn, "edit.html", page_title: "Edit The Thing")
end

<head>
  <title><%= assigns[:page_title] || "Default Title" %></title>
</head>

Обратите внимание, что здесь используется assigns[:page_title] вместо @page_title или assigns.page_title, так как они выдадут ошибку, если в назначениях нет клавиши :page_title.


Для включения шаблонов (пример вашего скрипта) есть render_existing/3документы для той же функции в последней версии Phoenix).

В документации приведен пример, аналогичный тому, который вы запрашивали, поэтому я скопировал его здесь для удобства:

Рассмотрим случай, когда макет приложения позволяет представлениям динамически отображать раздел тегов сценария в заголовке документа. Некоторые представления могут захотеть внедрить определенные сценарии, а другие нет.

<head>
  <%= render_existing view_module(@conn), "scripts.html", assigns %>
</head>

Затем модуль для представления @inner может принять решение предоставить сценарии либо с предварительно скомпилированным шаблоном, либо напрямую реализовав функцию, т.е.

def render("scripts.html", _assigns) do
  "<script src="...">"
end

Чтобы использовать предварительно скомпилированный шаблон, создайте файл scripts.html.eex в каталоге шаблонов для соответствующего представления, для которого вы хотите его визуализировать. Например, для UserView создайте файл scripts.html.eex в web/templates/user/.