Elixir 凤凰卫视:这是哪里';分配';来自哪里?
我在elixir phoenix自动创建的“app.html.eex”中发现了一个子句:Elixir 凤凰卫视:这是哪里';分配';来自哪里?,elixir,phoenix-framework,Elixir,Phoenix Framework,我在elixir phoenix自动创建的“app.html.eex”中发现了一个子句: <main role="main"> <%= render @view_module, @view_template, assigns %> </main> 但是这个关键字映射“assigns”从哪里来?assigns是一个模板上下文局部变量,通过在文档中声明 分配 “分配是指模板中可用的用户数据。但是,Phoenix专门处理分配下的一些键,它们是: :lay
<main role="main">
<%= render @view_module, @view_template, assigns %>
</main>
但是这个关键字映射“assigns”从哪里来?
assigns
是一个模板上下文局部变量,通过在文档中声明
分配
“分配是指模板中可用的用户数据。但是,Phoenix专门处理分配下的一些键,它们是:
:layout-告诉Phoenix在给定布局中包装渲染结果。请参阅下一节。
以下分配是保留的,不能直接设置:
@视图模块-正在渲染的视图模块
@view_template-正在呈现的@view_模块的模板”
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 %>
我最常见的做法是将用户设置为“分配”,以便在这样的视图中具有访问权限
…插头/设置用户
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 %>
你好
... 做点别的
要分配值,请使用“分配”
要获取使用“分配”的值
在控制器中,当执行
渲染conn,“index.html”,key::value
时,赋值将填充key::value
对,以及调用赋值(conn,:other_key,:other_value)
的任何位置。实际分配保存在连接中
。您只需在模板中方便地访问它们。@JustinWood我知道,但是这个app.html.eex是由phoenix自己自动生成的,我想知道这个变量是从哪里来的。它必须在phoenix的源代码中的某个地方。您是否询问它在phoenix库代码中的何处生成赋值
变量?因为这与您的问题不同。assigns
只是指conn.assigns
。除非我误解了这个问题?@JustinWood是的,我在问变量来自凤凰图书馆的哪里。谢谢。我的坏朋友,谢谢。你能在phoenix的源代码中给我们更多关于这个过程的细节吗?我有phoenix的源代码,在那里它被定义,链接。
<%= if @conn.assigns.user do %>
Hello, <%= @conn.assigns.user.first_name %>!
<% else %>
... do something else
<% end %>