《Programming Phoenix》:‘assigns’关键字映射的来源是什么?
assigns来源的详解 嘿,这个问题问得特别到位!我当初啃《Programming Phoenix》的时候也纠结过这个assigns的来龙去脉,现在给你掰扯清楚:
控制器是变量的起点:当你在Phoenix控制器的动作里写类似
render(conn, "index.html", products: products, category: category)的代码时,最后那个键值对列表(products: products, category: category)就是在往assigns里塞变量。Phoenix会自动把这些变量整合到conn结构体的assigns字段中。自动传递到布局模板:控制器处理完请求后,Phoenix会把
conn.assigns里的所有变量,加上它自己注入的@view_module(对应要渲染的视图模块,比如MyApp.ProductView)和@view_template(对应具体模板文件名,比如"index.html"),一起传递给布局模板app.html.eex。这时候布局模板里的assigns就包含了所有这些数据。完整传递给子模板:
app.html.eex里的<%= render @view_module, @view_template, assigns %>这句,就是把布局模板的assigns完整传递给具体的页面子模板。这样子模板里就能直接通过@products、@category这种形式访问到控制器传过来的变量了。额外变量也会被包含:如果你在布局模板里手动添加变量(比如
<%= assign(conn, :page_title, "商品列表") %>),这些变量也会被加入到assigns中,同样能被子模板访问到。
内容的提问来源于stack exchange,提问作者chenyuandong

