如何在Phoenix中创建View属性?

时间:2016-09-15 08:29:10

标签: elixir phoenix-framework

有人能解释一下来自控制器的变量如何在视图中神奇地显示为模块属性吗?

例如,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。这意味着@userMyApp.UserView模块的属性。但是如何?

1 个答案:

答案 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))