Overview
Build Rails applications using nothing but Phlex components. No ERB, Haml, or Slim templates. No partials, templates, or helpers.
Going all-in on Phlex doesnβt mean you have to throw out all that stuff. You can spin it up side-by-side with legacy views and incrementally migrate to going all-in on Phlex.
Superview
Weβll go through how to install Superview and set up the controllers via:
$ bundle add superview
Then configure the controllers:
# ./app/controllers/posts_controller.rb
class PostsController < ApplicationController
include Superview::Actions
# Do this if you're using Phlex to render the layout.
layout false
# ...
end
Sinatra vibes in Rails without the hangover
π Unlock content
Purchase this course to unlock this video, source code, and content.
β ββββββββ ββββββββ βββ ββββββ βββββ ββ βββββββ βββββββ ββββββββ βββ βββββ βββββ ββ βββ ββββββββββββββββββ βββββ ββββ ββββ βββββ βββββ βββββββββββ β ββββββββ βββ βββ βββ ββββ ββββββ ββββ βββββ β βββ ββββββ ββ ββββββ ββββββββ ββ βββ ββββ β βββββ ββββ β ββββββ β βββ ββ ββββ βββββββββββββ ββββββββ β βββββ βββββββ ββ ββββββ ββ ββββ ββββββ ββββ βββββ ββββ ββ βββ βββ βββ βββββ ββ βββββ ββββββββ βββ ββββ ββββ ββββββ
Embedding Phlex views in controllers
βββββββ βββββ ββββββββββ βββ ββββ β βββ ββββββ βββββ βββββββββ βββββ ββββββββ ββββ ββββββββββββ βββ βββββ ββββββ ββββ β βββββ βββ ββ βββββββββ ββ βββββββββββ ββββ βββββββββββββ βββββββ
β βββββββββββββββββββββββββββββββββββββ
class PostsController < βββββββββββββββββββββ
include βββββββββ::βββββββ
βββββββββββββ do
βββββ = ββββ.ββββ(ββββββ[:id])
end
class Show < ββββββββββ::ββββ
attr_accessor :post
def βββββββββββββ(&)
ββ { βββββ.βββββ }
βββ(class: "prose") { βββββ.ββββ }
end
end
end
Moving views out of controllers
ββββ ββββββ ββββ βββββββββββ βββ ββββββββ βββ βββ ββββ βββ ββββ βββββ βββ ββ βββ βββββββββββ
β βββββββββββββββββββββββββ
class Views::Posts::Show < ββββββββββ::ββββ
attr_accessor :post
def βββββββββββββ(&)
ββ { βββββ.βββββ }
βββ(class: "prose") { βββββ.ββββ }
end
end
ββββ βββββββ ββββ ββββ ββ βββ ββββββββββ ββ βββββββββ βββββ ββββ βββ
β βββββββββββββββββββββββββββββββββββββ
class PostsController < βββββββββββββββββββββ
include βββββββββ::βββββββ
include βββββ::βββββ
βββββββββββββ do
βββββ = ββββ.ββββ(ββββββ[:id])
end
end
Works with ViewComponent
βββββββββ βββββ ββββ βββ ββββ ββββββ ββββ ββββββββ ββ βββββββββββ ββββ ββ βββββ βββ ββββββββββββββ
β βββββββββββββββββββββββββββββββββββββ
class PostsController < βββββββββββββββββββββ
β βββ
class Edit < βββββββββββββ::ββββ
attr_accessor :post
def ββββ
<<~ββββ
<h1>Edit #{βββββ.βββββ}</h1>
<form action="<%= post_path(@post) %>" method="post">
<input type="text" name="title" value="<%= @post.title %>">
<textarea name="body"><%= @post.body %></textarea>
<button type="submit">Save</button>
</form>
ββββ
end
end
end
β βββββ ββ ββββ ββββ ββββββ βββββ ββββ βββββ ββββ ββ β βββββ βββββ βββββββ βββ ββββ βββββ βββββββ ββββ βββββββββ
Superform & automatic strong parameters
ββββββββ ββ βββ ββββββββ βββ ββββββββ βββββββββββ ββββββββββ ββββ ββββ βββββββββ ββ ββββββ ββββ ββββββββββ βββ βββββββββ ββ βββββββββββββ ββββββ βββββββββββ
β βββββββββββββββββββββββββββββββββββββ
class PostsController < βββββββββββββββββββββ
include βββββββββ::βββββββ
include βββββββββ::βββββ::ββββββββββββββββ
βββββββββββββ do
βββββ = ββββββ.ββββ(:id) ? ββββ.ββββ(ββββββ[:id]) : ββββ.βββ
end
class Form < ββββββββββ::ββββ
def βββββββββββββ
βββββ(:title).ββββ
βββββ(:body).ββββββββ
ββββββ "Create post"
end
end
class View < βββββ::ββββ
attr_writer :post
end
class New < ββββ
def βββββββββββββ
ββ { "Create a blog post" }
ββββββ ββββ.βββ(βββββ)
end
end
def ββββββ
if ββββ ββββ.βββ(βββββ)
βββββββββββ βββββ
else
ββββββ βββββββββ βββ
end
end
end
ββββ ββββββ βββ ββ βββββββ βββββ ββββ ββββββββββ ββββ βββ ββ ββββββββ ββββ βββ ββββ βββββ ββ ββββββ