Turbo Pagemorphs
I always recommend starting with Turbo Pagemorphs before bothering with Turbo Streams or Turbo Frames. Turbo Pagemorphs are the simplest way to add interactivity to your Rails application. They also work best with components.
When then does it make sense to use Turbo Streams or Turbo Frames? When Pagemorphs donβt work well, but they should for 80% of use cases.
Pagemorphs with components
The best part about Turbo Pagemorphs is they work with components right out of the box, without any modifications.
Consider a post with comments. The view would show the post and a list of whatever comments it currently has.
π Unlock content
Pre-order this course to unlock this video, source code, and content.
class View::Post < ββββ::ββββ
def ββββββββββ(ββββ:)
βββββ = ββββ
end
def βββββββββββββ
ββ { βββββ.βββββ }
ββββ(class: "prose"){
ββββ ββββββ βββββ.ββββ, type: :md
}
βββ(id: "comments") do
ββββββββ.ββββ do |βββββββ|
βββ(class: "comment") do
p { βββββββ.ββββ }
end
end
end
end
end
Add turbo tags to the head
tags
βββββ ββ βββ ββββ βββββ βββββ βββββββββ ββββ βββββ ββ ββββ ββ βββββββ βββ ββββ βββ ββββ βββββββββ βββββ ββ βββ βββββββββββ
class View::Base < ββββ::βββββββββ
β βββββββ ββ βββββ ββ βββββ βββ ββββββββ βββ βββββ
def ββββββββββββββββββββ = nil
β βββββββ ββ βββββ ββ βββββ βββ βββββββββ ββ βββ βββ ββ βββ ββββ
def ββββββββββββββββββββ = nil
β βββ βββ βββββββββββββ ββββ ββ βββ βββββββββ
def βββββββββββββ = nil
def βββββββββββββββ
ββββ do
β βββββ ββββ ββββ
ββββ(name: "turbo-pageload", content: ββββββββββββββββββββ)
ββββ(name: "turbo-refresh-scroll", content: ββββββββββββββββββββ)
β ββββ ββββ βββββββ
end
β βββββββ βββ ββββ βββ
ββββ do
yield
βββββββββββββ
end
β ββββββββ ββββ βββ
end
end
Configuring the view to stream page morphs
βββ ββββ βββββ βββββ βββ ββββ ββββ ββ βββ ββββββ ββββ βββββ ββ ββββ ββ ββββββββ βββ βββββββ ββ βββ ββββββββββ ββ βββββββ ββββ βββββ βββββββββ
class View::Post < ββββ::ββββ
β ββββββββ βββ βββββββββββββββββ ββββββ
include βββββ::βββββ::βββββββ::βββββββββββββββ
def ββββββββββ(ββββ:)
βββββ = ββββ
end
β βββ ββ βββ βββββ ββββββ ββββββββ ββ ββββββββββ ββββ βββ ββββββ
def ββββββββββββββββββββ = "replace"
def ββββββββββββββββββββ = "preserve"
def βββββββββββββ
βββββββββββββββββ βββββ.ββββββββ
end
def βββββββββββββ
ββ { βββββ.βββββ }
ββββ(class: "prose"){
ββββ ββββββ βββββ.ββββ, type: :md
}
βββ(id: "comments") do
ββββββββ.ββββ do |βββββββ|
βββ(class: "comment") do
p { βββββββ.ββββ }
end
end
end
end
end
ββββ βββ ββββ ββ βββββββββ βββ βββββββ ββ ββββββββ ββββ βββββββ βββ ββββββββ ββ βββββ βββββββ βββ βββ βββββ βββ ββββ βββ ββ βββ ββββββ βββββ βββββ ββ ββββ ββ ββββββ βββ βββββββββ
Configure model to broadcast updates
ββββ β βββββββ ββ βββββ ββ βββ βββββ βββ βββββ ββββ βββββββββ ββ ββββββ ββ βββ βββββ ββββ βββ ββ ββ ββββββββββ ββββ βββ βββββββ ββββββββββββ ββββββ
class Comment < βββββββββββββββββ
ββββββββββ :post
βββββββββββββββββββββββ -> { [ ββ.ββββ, :comments ] }
end
ββββ β βββββββ ββ ββββββ ββ ββββ ββββ β ββββββββββββ ββ βββ βββββ βββββββββ βββββ βββββ βββββββββ ββ ββββ ββββ βββββ ββ βββ βββββ
def βββββββββββββ
βββββββββββββββββ βββββ.ββββββββ
end
Wiring it up to the controller
βββ ββββ βββ ββββββ ββββ ββββββββ βββββ βββββββββββ ββ βββ ββββ ββ ββ ββ βββ βββββββββββ
class PostsController < βββββββββββββββββββββ
def ββββ
βββββ = ββββ.ββββ(ββββββ[:id])
ββββββ ββββ::ββββ.βββ(post: βββββ)
end
end
βββ ββββ ββ ββ ββ ββββ βββββ βββββββ βββ ββββ ββββ βββββββ βββ ββββ βββ βββββββ βββ ββββββββ
Reactive approach to updating apps
βββ ββββββ ββ ββββ ββββββββ ββ βββ ββββ ββββββ ββ βββββββ ββ βββ βββββ βββββ βββββ ββ βββββ ββββ ββ βββββ βββββββββ ββββββββββ βββββββ ββ ββββββ ββββ ββββββββββ ββββββββ βββ ββββββ ββββ ββββ ββββ ββ βββ βββββββ βββββ βββββ βββ βββββββ βββ βββββββ ββββ βββββββββββ ββ βββ ββββββ