Layouts
In Rails applications, layouts are typically defined in seperate files and βwrapβ a view via some sort of yield
block.
The old way of doing layouts in Rails
Hereβs what a basic Erb layout might look like.
<!DOCTYPE html>
<html>
<head>
<title><%= content_for(:title) %></title>
</head>
<body>
<h1><%= content_for(:title) %></h1>
<%= yield %>
</body>
</html>
Then we might have a view file that looks like this.
<% content_for(:title, @user.name) %>
<dl>
<dt>Name</dt>
<dd><%= @user.name %></dd>
<dt>Email</dt>
<dd><%= @user.email %></dd>
</dl>
Then from the controller we can render the layout and view together.
class UsersController < ApplicationController
layout 'user'
def show
@user = User.find(params[:id])
end
end
Layouts in Phlex via inheritance
π Unlock content
Pre-order this course to unlock this video, source code, and content.
βββββββ ββ βββββ βββ ββ ββββββββ ββββ βββββββββββ βββ βββ βββββββββββββββ βββββββ
class UserLayout < βββββ::ββββ
def βββββββββββββββ
ββββ do
ββββ do
βββββ { ββββββ }
end
ββββ do
ββ { ββββββ }
yield
end
end
end
end
βββ ββββ βββββ ββββ ββ βββββββ ββββ β ββββββββ ββ βββββββββββ
class UserView < ββββββββββ
def ββββββββββ(ββββ:)
βββββ = ββββ
ββββββ = ββββ.ββββ
end
def βββββββββββββ
ββ do
ββ { 'Name' }
ββ { βββββ.ββββ }
ββ { 'Email' }
ββ { βββββ.βββββ }
end
end
end
ββββ ββββ βββ ββββββββββ ββ βββ ββββββ βββ ββββββ βββ ββββ βββββββββ
class UsersController < βββββββββββββββββββββ
ββββββ 'user'
def ββββ
ββββββ ββββββββ.βββ(
user: ββββ.ββββ(ββββββ[:id])
)
end
end
βββββββ βββ βββββββ ββββ ββββ βββββββββ ββββ ββββ βββββββ ββ ββββββ βββ βββββ ββ βββ ββββ ββββ βββ ββββββ β βββββββββ βββββββββββ ββ βββ βββββββ ββββββ βββββββ ββ βββββββββ βββ ββββ ββ βββββ βββ ββββ βββ ββ ββββββββ βββββββββ
Composing layouts
βββββ βββββ βββββββ ββββ ββββ ββ ββββββββ ββ βββββ ββββββββ βββ βββββ ββ ββββ ββ βββββ βββββ βββ βββββ βββββββ ββ ββββ βββ βββββββ βββββ βββββ ββββββ βββ ββββββββ ββ βββ ββ βββββββ βββββ ββββββ
class UserView < ββββββββββ
def ββββββββββ(ββββ:)
βββββ = ββββ
end
def βββββ = βββββ.ββββ
def βββββββββββββ
ββ do
ββ { 'Name' }
ββ { βββββ.ββββ }
ββ { 'Email' }
ββ { βββββ.βββββ }
end
end
end
ββββ ββ βββ βββ βββββ βββββββ ββββββββ ββ βββ ββββββββββ ββββββββββββ
class UserLayout < βββββ::ββββ
def ββββββββββ(βββββ:)
ββββββ = βββββ
end
def βββββββββββββββ
ββββ do
ββββ do
βββββ { ββββββ }
end
ββββ do
ββ { ββββββ }
yield
end
end
end
end
βββββ ββββ ββββ βββββββββ
class UserView < ββββββββββ
def ββββββββββ(ββββ:)
βββββ = ββββ
end
def βββββββββββββββ(&ββββ)
super do
ββββββ ββββββββββ.βββ(βββββ:, &ββββ)
end
end
end
ββββ ββββββ βββ βββ ββββββββ βββ βββ βββββ ββββββββ ββ ββββββ βββ ββββ ββ ββββββββ βββββββββ ββ βββ βββββ ββββββ ββββ βββ ββββ βββββ βββββ
class Users::Show < ββββββββ
def βββββ = βββββ.ββββ
def βββββββββββββ
ββ do
ββ { 'Name' }
ββ { βββββ.ββββ }
ββ { 'Email' }
ββ { βββββ.βββββ }
end
end
end
OpenGraph
βββββ βββββββββββ βββ ββββββββββββ ββ βββ βββββ βββββββ ββββ βββ ββββββ ββ βββββββ ββββ βββ βββββ βββββ βββ βββββββββ ββββ ββ βββ βββββββ
class UserLayout < βββββ::ββββ
β βββββ βββββββββ ββββββ
βββββββββ = ββββ.ββββββ(:title, :type, :url, :image) do
def ββββββββββ(title: nil, type: 'website', url: nil, image: nil)
super
end
end
def ββββββββββ(βββββ:)
ββββββ = βββββ
end
def ββ = βββββββββ.βββ(βββββ:, url: βββββββ.βββ)
def βββββββββββββββ
ββββ do
ββββ do
βββββ { ββββββ }
ββββ property: 'og:title', content: ββ.βββββ
ββββ property: 'og:type', content: ββ.ββββ
ββββ property: 'og:url', content: ββ.βββ
ββββ property: 'og:image', content: ββ.βββββ
end
ββββ do
ββ { ββββββ }
yield
end
end
end
end
ββββ ββββ βββ ββββ βββββ ββ βββ βββ βββββββββ ββββ ββ βββ βββββββ
class UserView < ββββββββββ
def ββββββββββ(ββββ:)
βββββ = ββββ
end
def ββ = βββββββββ.βββ(βββββ:, url: βββββββ.βββ)
def βββββββββββββββ(&ββββ)
super do
ββββββ ββββββββββ.βββ(βββββ:, ββ:, &ββββ)
end
end
end
ββββ βββ ββββ βββββ ββ βββ ββββββ βββ βββββ βββ βββββββββ βββββ
class Users::Show < ββββββββ
def βββββ = βββββ.ββββ
def ββ
βββββββββ.βββ(title:
βββββ.ββββ,
url: βββββββ.βββ,
image: βββββ.ββββββββββ
)
end
def βββββββββββββ
ββ do
ββ { 'Name' }
ββ { βββββ.ββββ }
ββ { 'Email' }
ββ { βββββ.βββββ }
end
end
end
Using Phlex layouts with Ruby Erb views
ββ ββββββ βββββββββ ββββ βββ ββ ββββββ βββ βββββ ββββ ββ βββββββ ββββ βββββ βββββββ βββ ββ ββββ ββββ ββββ βββ ββββββ ββββ ββββββ βββ ββ ββββββββ βββ βββββ ββ βββββ βββββββ βββββ βββββ βββββ βββ ββββββββ ββββββ ββ ββββ ββββ
β