Phoenix and using multiple layouts
26/01/2016
Phoenix
1. How to specify the layout when render() in controllers
There is an option in render/3 method, source
In the below example, I did specify the layout, the layout will be located at @conn.assigns[:layout], so as :id
defmodule ImageQuickShare.ImageController do
use ImageQuickShare.Web, :controller
def show(conn, %{"id" => id}) do
render(conn, "show.html", id: id,
layout: {ImageQuickShare.ImageView, "empty_layout.html"})
end
endThe directory which locate layout look like:
templates
├── image
│ ├── empty_layout.html.eex
│ └── show.html.eex
├── layout
│ └── app.html.eex
└── page
└── index.html.eex2. Setup a default layout for all method within a controller
We have to use plug :put_layout.
defmodule ImageQuickShare.ImageController do
use ImageQuickShare.Web, :controller
plug :put_layout, {ImageQuickShare.ImageView, "empty_layout.html"} #<--- HERE
def show(conn, %{"id" => id}) do
render(conn, "show.html", id: id)
end
end3. Get advanced from PLUG.
Because of using plug, we can also specify the defaul layout in router. In route.ex we can define an extra pipeline.
pipeline :empty_layout do
plug :put_layout, {ImageQuickShare.ImageView, "empty_layout.html"}
endAnd then, within scope, add the pipeline via pipe_through. Here is an example.
scope "/", ImageQuickShare do
pipe_through [:browser, :empty_layout] # Use the default browser stack
get "/", PageController, :index
get "/image", ImageController, :show
end