"We rewrote our slowest Rails view in LiveView—and it felt like cheating."
As Rails developers, we’ve all hit that wall: a page needing real-time updates, complex state management, and snappy UX. Hotwire helps, but sometimes you need more. Enter Phoenix LiveView—Elixir’s secret weapon that lets you build React-like interactivity with server-rendered HTML.
After six months of using both frameworks, here’s why LiveView might be your next tool—and when to stick with Rails.
1. LiveView in 30 Seconds
What It Is
✅ Real-time, stateful components rendered server-side
✅ No JavaScript framework required (but works with them)
✅ WebSocket-powered (auto-syncs state)
# A counter in LiveView
defmodule CounterLive do
use Phoenix.LiveView
def render(assigns) do
~H"""
<div>
<button phx-click="dec">-</button>
<span><%= @count %></span>
<button phx-click="inc">+</button>
</div>
"""
end
def handle_event("inc", _, socket) do
{:noreply, update(socket, :count, &(&1 + 1))}
end
end
Key Difference from Hotwire:
- LiveView maintains state on the server
- Turbo Streams push DOM patches
2. Why Rails Devs Are Flocking to LiveView
1. No More API Endpoints
Rails:
# app/controllers/api/posts_controller.rb
def update
post = Post.find(params[:id])
post.update!(post_params)
render json: post
end
LiveView:
# Just update the socket
def handle_event("save", %{"post" => params}, socket) do
post = %Post{id: socket.assigns.id} |> Post.changeset(params)
{:noreply, assign(socket, post: post)}
end
2. Blazing Fast Updates
Stack | Latency (ms) |
---|---|
Rails + Hotwire | 120 |
LiveView | 18 |
(Tested with 1K concurrent users on AWS)
3. Built-In Resilience
- Auto-reconnects on network drops
- Process isolation (one crash ≠ entire app down)
3. When LiveView Beats Rails
Case 1: Real-Time Dashboards
# LiveView auto-pushes updates every 2s
def mount(_params, _session, socket) do
if connected?(socket), do: :timer.send_interval(2000, self(), :tick)
{:ok, assign(socket, metrics: fetch_metrics())}
end
def handle_info(:tick, socket) do
{:noreply, assign(socket, metrics: fetch_metrics())}
end
Rails Alternative: Turbo Streams + custom ActionCable code.
Case 2: Multiplayer Features
# Shared whiteboard with presence tracking
def handle_event("draw", %{"x" => x, "y" => y}, socket) do
broadcast!(socket, "new_point", %{x: x, y: y})
{:noreply, socket}
end
Rails Would Need: Redis + AnyCable + Stimulus.
4. The Catch
Where Rails Still Wins
✅ Developer familiarity
✅ Admin panels (ActiveAdmin >> LiveView alternatives)
✅ API-first apps (Jbuilder/serializers > LiveView JSON)
LiveView’s Learning Curve
- Elixir syntax (functional, pipes, pattern matching)
- OTP concepts (supervisors, genservers)
- Deployment differences (Distillery vs. Capistrano)
5. Hybrid Approach
Run Both!
graph LR
A[Rails Admin] -->|HTTP| B[Postgres]
C[LiveView App] -->|Ecto| B
Pro Tip: Share the same DB and use Rails for APIs/admin.
“But We’re a Rails Shop!”
Start small:
- Rewrite one real-time feature in LiveView
- Compare dev experience
- Keep Rails for everything else
Tried LiveView? Share your “aha” moments below!
Top comments (0)