Phoenix мнение не HTML шаблонов со встроенным языком программирования, как html.erb
, но и имена аналогичные тем, которые находятся в Django, где view
означает код для отображения данных и template
означает фактический HTML со встроенным кодом Elixir (и у них есть расширение eex
). Согласно официальному руководству для Phoenix Framework, краткой информации о просмотрах:
Они также выступают в качестве презентационного слоя для необработанных данных от контроллера, подготавливая его для использования в качестве шаблона. Функции, которые выполняют это преобразование, должны идти в поле зрения.
Проверьте это:
Рубин на Rails потока:
router.rb -> Controller (-> Model) -> view in html.erb
Джанго потока:
urls.py -> View (act like Controller) -> Template
Феникс потока:
endpoint (in lib) -> router (in web) -> Controller -> View -> Template
Поток Феникса кажется длинным, но это не так. Самое большое преимущество для вас:
У вас есть явный контроль над промежуточным программным обеспечением!
Помните, что-framework делает магию для вас, но явно. Вы точно видите, какие макросы и другие вещи называются.
Редактировать
Заканчивать материал, который импортируется при использовании use
в вашем коде.
В вашем контроллере вы используете Phoenix.Controller
материал, который предоставляет вам функцию render
.
Вы вызываете render
с шаблоном conn и присваиваете параметры. В deps/phoenix/lib/phoenix/controller.ex
у вас есть эта функция render
запоминаются и в частной функции do_render
линии:
view = Map.get(conn.private, :phoenix_view) ||
raise "a view module was not specified, set one with put_view/2"
получает свой вид имя из текущего соединения.
И несколько строк позже использует его:
Phoenix.View.render_to_iodata(view, template, Map.put(conn.assigns, :conn, conn))
Этот вызов использует внутренне render
в deps/phoenix/lib/phoenix/view.ex
, а затем render_within
, но имя папки устанавливается в __using__
use Phoenix.Template, Phoenix.View.__template_options__(__MODULE__, unquote(opts))
который вызывает __template__options
где размещаются следующие строки:
module
|> Module.split()
|> Enum.take(1)
|> Module.concat()
, который делает Hello
от Hello.PageView
или каким бы то ни было именем.
Edit2
Об изменении режима отображения по умолчанию в контроллере (информация от Phoenix документации):
По умолчанию контроллеры делают шаблоны в представлении с похожим именем к контроллеру. Например, MyApp.UserController
будет отображать шаблонов внутри MyApp.UserView
. Эта информация может быть изменена в любое время с помощью render/3
, render/4
или функцию put_view/2
:
def show(conn, _params) do
render(conn, MyApp.SpecialView, :show, message: "Hello")
end
def show(conn, _params) do
conn
|> put_view(MyApp.SpecialView)
|> render(:show, message: "Hello")
end
Отлично! Большое спасибо. Но можете ли вы сказать мне, как он знает, что «hello_world.html» находится в папке «hello»? Я не видел никакого кода, который так и есть. Я загрузил снимок экрана проекта –
Я обновил свой ответ. – PatNowak
ничего не видел. Ты уверен? –