凤凰编程:这是什么?分配'来自(哪里?

时间:2018-04-01 17:58:34

标签: elixir phoenix-framework

我在app.html.eex'中找到了一个条款。由elixir phoenix自动创建:

<main role="main">
   <%= render @view_module, @view_template, assigns %>
</main>

但是这个关键字地图在哪里分配&#39;来自?

2 个答案:

答案 0 :(得分:1)

assignshygiene bypassing中通过template compile-time声明的模板上下文局部变量。

答案 1 :(得分:0)

根据文档Phoenix.View.hmtl

<强>分配

&#34;分配是指模板中可用的用户数据。但是,凤凰专门处理的指令下有钥匙,它们是:

:layout - 告诉Phoenix将渲染结果包装在给定的布局中。见下一节。 以下分配是保留的,不能直接设置:

@view_module - 正在渲染的视图模块 @view_template - 正在呈现的@ view_module模板&#34;

assigns是conn对象上的一个属性,用于添加数据以传递类似选项。

分配给@ conn.assigns, 在任何控制器,你可以玩这个 将此代码添加到控制器索引

defmodule MyAppWeb.PageController do
  use MyAppWeb, :controller

  def index(conn, _params) do
    conn = assign(conn, :thing, "this is not a taco")
    render conn, "index.html"
  end
end

然后在app.html.eex中添加此行

<%= assigns.thing %>
那么你应该看到&#34;这不是炸玉米饼&#34;当你点击控制器索引时,&#34; /&#34;在这个例子中

如果您将此行添加到控制器,则可以在服务器中看到它

...
    conn = assign(conn, :thing, "this is not a taco")
    IO.inspect(conn.assigns)
...

我最常见的是这用于设置用户指定在这样的视图中访问 ...插头/ set_user

 def init(_params) do
 end

 def call(conn, _params) do
    if conn.assigns[:user] do
      conn
    else
      user_id = get_session(conn, :user_id)

      cond do
        user = user_id && Repo.get(User, user_id) ->
          assign(conn, :user, user)
        true ->
          assign(conn, :user, nil)
      end
    end
 end

...视图/ HTML

  <%= if @conn.assigns.user do %>
      Hello, <%= @conn.assigns.user.first_name %>!       
  <% else %>
  ... do something else
  <% end %>

指定您使用的值&#39;分配&#39;

获取您使用的值&#39;指定&#39;

docs on Plug.conn