默认 layout 是 templates/layout/app.html.eex 这个文件,但是加入我们想设定不同页面采用不同的 layout,该怎么做呢?
1. 修改 Controller Render 函数
通过传入 render layout 参数
def index(conn, _params) do
render conn, "index.html",
layout: {MyApp.LayoutView, "admin.html"}
end
这样我们可以单独控制 controller 中每个方法的渲染 layout。
2. 修改 Controller 总体 Layout
defmodule MyApp.Admin.SomeController do
use MyApp.Web, :controller
plug :put_layout, "admin.html"
def index(conn, _params) do
render conn, "index.html"
end
end
我们在 controller 中引入 :put_layout
这个 plug
3. 在 Router 中修改总体 Layout
# web/router.ex
pipeline :admin_layout do
plug :put_layout, {MyApp.LayoutView, :admin}
end
scope "/admin", MyApp do
pipe_through [:browser, :admin_layout]
resources "/some_path", Admin.SomeController
end
我们可以在 Router 中添加 plug 来修改一个 scope 下所有页面的 layout
总结
- 修改单独页面:方法1
- 修改某 controller 所有页面:方法2
- 修改某路由所有页面:方法3