Pre-order

Layouts

In the last video, we ended up with a controller that rendered inline views that looks like this:

class PostsController < ApplicationController
  before_action do
    @blog = current_user.blog
    @posts = @blog.posts
  end

  class Index < Phlex::HTML
    def initialize(posts:)
      @posts = posts
    end

    def template
      h1 "Posts"
      ul do
        @posts.each do |post|
          li do
            a href: post_path(post), post.title
          end
        end
      end
    end
  end

  def index
    render Index.new(posts: @posts)
  end

  # ...
end

How do we handle layouts in Phlex?

Working towards layouts

Since layouts are a different concern than a view, we’re going to work towards extracting layouts out of our view classes and use class composition to achieve our goal.

Rendering content around a view

πŸ”“ Unlock content

Pre-order this course to unlock this video, source code, and content.

Pre-order video course for $379 $289

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

class Index < β–“β–“β–“β–“β–“::β–“β–“β–“β–“
  def β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“(β–“β–“β–“β–“β–“:)
    β–“β–“β–“β–“β–“β–“ = β–“β–“β–“β–“β–“
  end

  β–“ β–“β–“β–“β–“β–“ β–“β–“β–“ β–“β–“β–“β–“ β–“β–“β–“β–“ β–“ β–“β–“β–“β–“β–“β–“
  def β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“(&β–“β–“β–“β–“β–“β–“β–“)
    super do
      β–“β–“β–“β–“(class: "prose", &β–“β–“β–“β–“β–“β–“β–“)
    end
  end

  def β–“β–“β–“β–“β–“β–“β–“β–“
    β–“β–“ "Posts"
    β–“β–“ do
      β–“β–“β–“β–“β–“β–“.β–“β–“β–“β–“ do |β–“β–“β–“β–“|
        β–“β–“ do
          β–“ href: β–“β–“β–“β–“β–“β–“β–“β–“β–“(β–“β–“β–“β–“), β–“β–“β–“β–“.β–“β–“β–“β–“β–“
        end
      end
    end
  end
end

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

class View < β–“β–“β–“β–“β–“::β–“β–“β–“β–“
  β–“ β–“β–“β–“β–“β–“ β–“β–“β–“ β–“β–“β–“β–“ β–“β–“β–“β–“ β–“ β–“β–“β–“β–“β–“β–“
  def β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“(&β–“β–“β–“β–“β–“β–“β–“)
    super do
      β–“β–“ { β–“β–“β–“β–“β–“ }
      β–“β–“β–“β–“(class: "prose", &β–“β–“β–“β–“β–“β–“β–“)
    end
  end
end

class Index < β–“β–“β–“β–“
  def β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“(β–“β–“β–“β–“β–“:)
    β–“β–“β–“β–“β–“β–“ = β–“β–“β–“β–“β–“
  end

  def β–“β–“β–“β–“β–“ = "Posts"

  def β–“β–“β–“β–“β–“β–“β–“β–“
    β–“β–“ do
      β–“β–“β–“β–“β–“β–“.β–“β–“β–“β–“ do |β–“β–“β–“β–“|
        β–“β–“ do
          β–“ href: β–“β–“β–“β–“β–“β–“β–“β–“β–“(β–“β–“β–“β–“), β–“β–“β–“β–“.β–“β–“β–“β–“β–“
        end
      end
    end
  end
end

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

Extracting the layout into its own class

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

β–“ β–“β–“β–“β–“β–“β–“β–“ β–“β–“β–“ β–“β–“β–“β–“ β–“β–“β–“β–“ β–“β–“β–“β–“β–“ β–“β–“β–“β–“β–“β–“β–“β–“β–“ β–“β–“β–“ β–“β–“β–“β–“β–“ β–“β–“β–“β–“β–“β–“ β–“β–“β–“β–“
class Layouts::Base < β–“β–“β–“β–“β–“::β–“β–“β–“β–“
  def β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“(β–“β–“β–“β–“β–“:)
    β–“β–“β–“β–“β–“β–“ = β–“β–“β–“β–“β–“
  end

  def β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“
    β–“β–“β–“β–“ do
      β–“β–“β–“β–“ do
        β–“β–“β–“β–“β–“ { β–“β–“β–“β–“β–“β–“ }
      end
      β–“β–“β–“β–“ do
        yield
      end
    end
  end
end

class Layouts::Post < β–“β–“β–“β–“β–“β–“β–“::β–“β–“β–“β–“
  β–“ β–“β–“β–“β–“β–“ β–“β–“β–“ β–“β–“β–“β–“ β–“β–“β–“β–“ β–“ β–“β–“β–“β–“β–“β–“
  def β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“(&β–“β–“β–“β–“β–“β–“β–“)
    super do
      β–“β–“ { β–“β–“β–“β–“β–“ }
      β–“β–“β–“β–“(class: "prose", &β–“β–“β–“β–“β–“β–“β–“)
    end
  end
end

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

Using the layout from the view

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

class View < β–“β–“β–“β–“β–“::β–“β–“β–“β–“
  β–“ β–“β–“β–“β–“β–“ β–“β–“β–“ β–“β–“β–“β–“ β–“β–“β–“β–“ β–“ β–“β–“β–“β–“β–“β–“
  def β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“(&β–“β–“β–“β–“β–“β–“β–“)
    super do
      β–“β–“β–“β–“β–“β–“ β–“β–“β–“β–“β–“β–“β–“::β–“β–“β–“β–“.β–“β–“β–“(β–“β–“β–“β–“β–“:)
    end
  end
end

Disable the Rails layout

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

class PostsController < β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“
  β–“β–“β–“β–“β–“β–“ false

  β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“ do
    β–“β–“β–“β–“β–“ = β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“.β–“β–“β–“β–“
    β–“β–“β–“β–“β–“β–“ = β–“β–“β–“β–“β–“.β–“β–“β–“β–“β–“
  end

  class View < β–“β–“β–“β–“β–“::β–“β–“β–“β–“
    β–“ β–“β–“β–“β–“β–“ β–“β–“β–“ β–“β–“β–“β–“ β–“β–“β–“β–“ β–“ β–“β–“β–“β–“β–“β–“
    def β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“(&β–“β–“β–“β–“β–“β–“β–“)
      super do
        β–“β–“β–“β–“β–“β–“ β–“β–“β–“β–“β–“β–“β–“::β–“β–“β–“β–“.β–“β–“β–“(β–“β–“β–“β–“β–“:)
      end
    end
  end

  class Index < β–“β–“β–“β–“
    def β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“(β–“β–“β–“β–“β–“:)
      β–“β–“β–“β–“β–“β–“ = β–“β–“β–“β–“β–“
    end

    def β–“β–“β–“β–“β–“β–“β–“β–“
      β–“β–“ "Posts"
      β–“β–“ do
        β–“β–“β–“β–“β–“β–“.β–“β–“β–“β–“ do |β–“β–“β–“β–“|
          β–“β–“ do
            β–“ href: β–“β–“β–“β–“β–“β–“β–“β–“β–“(β–“β–“β–“β–“), β–“β–“β–“β–“.β–“β–“β–“β–“β–“
          end
        end
      end
    end
  end

  def β–“β–“β–“β–“β–“
    β–“β–“β–“β–“β–“β–“ β–“β–“β–“β–“β–“.β–“β–“β–“(posts: β–“β–“β–“β–“β–“β–“)
  end

  β–“ β–“β–“β–“
end

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