有人能解释一下来自控制器的变量如何在视图中神奇地显示为模块属性吗?
例如,Controller中的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
模块的属性。但是如何?
答案 0 :(得分:2)
有人能解释一下来自控制器的变量如何在视图中神奇地显示为模块属性吗?
它们不是模块属性。 EEx使用相同的语法,并使用EEx.Engine
行为实现模块使用户可以插入行为。模板编译成函数时,The default EEx Engine converts them to EEx.Engine.fetch_assign!(var!(assigns), unquote(name))
和Phoenix's Engine converts them to Phoenix.HTML.Engine.fetch_assign(var!(assigns), unquote(name))
。