Pre-order

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.

Pre-order video course for $379 $289

β–“β–“β–“β–“β–“β–“β–“ β–“β–“ β–“β–“β–“β–“β–“ β–“β–“β–“ β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“β–“ β–“β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“β–“β–“β–“β–“β–“

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

β–“β–“ β–“β–“β–“β–“β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“β–“β–“ β–“β–“β–“ β–“β–“ β–“β–“β–“β–“β–“β–“ β–“β–“β–“ β–“β–“β–“β–“β–“ β–“β–“β–“β–“ β–“β–“ β–“β–“β–“β–“β–“β–“β–“ β–“β–“β–“β–“ β–“β–“β–“β–“β–“ β–“β–“β–“β–“β–“β–“β–“ β–“β–“β–“ β–“β–“ β–“β–“β–“β–“ β–“β–“β–“β–“ β–“β–“β–“β–“ β–“β–“β–“ β–“β–“β–“β–“β–“β–“ β–“β–“β–“β–“ β–“β–“β–“β–“β–“β–“ β–“β–“β–“ β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“β–“ β–“β–“β–“β–“β–“ β–“β–“ β–“β–“β–“β–“β–“ β–“β–“β–“β–“β–“β–“β–“ β–“β–“β–“β–“β–“ β–“β–“β–“β–“β–“ β–“β–“β–“β–“β–“ β–“β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“β–“β–“β–“β–“ β–“β–“ β–“β–“β–“β–“ β–“β–“β–“β–“

β–“