Как атрибуты просмотра создаются в Phoenix?

Может ли кто-нибудь объяснить мне, как переменная из контроллера волшебным образом появляется в представлении как атрибут модуля?

Например, это render/3 в Контроллере:

defmodule MyApp.UserController do
  def show(conn, %{"id" => user_id}) do
    render conn, "show.html", user: Repo.get(User, user_id)
  end

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

Hello, <%= @user.first_name %>

Я так понимаю, что шаблон стал функцией и находится в представлении, как MyApp.UserView. Это означает, что @user является атрибутом модуля MyApp.UserView. Но как?


person Grych    schedule 15.09.2016    source источник
comment
Я думаю, что первые два предложения моего ответа здесь хорошо отвечают на ваш вопрос: stackoverflow.com/a/39391047/320615   -  person Dogbert    schedule 15.09.2016
comment
Я понимаю! Большое спасибо @Dogbert, это правильный ответ. Я могу представить, что это сделано для того, чтобы шаблоны были похожи на рельсы. Пожалуйста, отправьте свой ответ, я приму его   -  person Grych    schedule 15.09.2016


Ответы (1)


Может ли кто-нибудь объяснить мне, как переменная из контроллера волшебным образом появляется в представлении как атрибут модуля?

Они не являются атрибутами модуля. EEx просто использует тот же синтаксис и делает их поведение подключаемым пользователем с помощью модуля реализации поведения EEx.Engine. EEx Engine по умолчанию преобразует их в EEx.Engine.fetch_assign!(var!(assigns), unquote(name)), в то время как движок их в Phoenix.HTML.Engine.fetch_assign(var!(assigns), unquote(name)), когда шаблоны скомпилированы в функции.

person Dogbert    schedule 15.09.2016