David Boureau

Web developer & teacher @saaslit

Live reload a Rails 7 application, an unsatisfaying attempt

Livereload a Rails app on your local machine is still not available natively. Maybe in next version of Rails, but not yet.

What is live reloading?

Live-reloading is a well-known concept for JavaScripters : you change your code, save the file, and the browser automagically reflect the change, without the need to press the "F5" key.

Actually I already tried with ViteJS 2 years ago.

Surprisingly, it has (not yet) been included by default in most backend frameworks, including Rails.

Prerequisites

ruby -v  # 3.3.0
rails -v  # 7.1.3
bundle -v  # 2.4.10
node -v # 20.11.0
git --version # 2.34.1

Create a new Rails 7 app with eslint and cssbundling

I'm not sure this method will work with importmaps (which are new Rails default), so let's try with good old JS and CSS build :

echo "Y" | rails new theapp -j=esbuild -c=tailwind

echo "Y" is here to avoid interruption while building the app.

See the issue I opened on Github. [EDIT: closed by DHH recently]

now

cd theapp
bin/rails db:create db:migrate

Install a default welcome page

  echo "class WelcomeController < ApplicationController" > app/controllers/welcome_controller.rb
  echo "end" >> app/controllers/welcome_controller.rb
  mkdir app/views/welcome
  echo '<h1 class="mb-4 text-4xl font-extrabold">welcome page</h1>' > app/views/welcome/index.html.erb

Now apply routes to these new pages :

  # inside config/routes.rb
  Rails.application.routes.draw do

    # add this line
    root "welcome#index"

    # all other routes remain unchanged
    # ...

  end

Install a gem for that

I remember that I had to use a chokidar + custom JS and config to get it work in previous Rails version, but now the Rails API seems much more stable in the front, we can quite safely try a gem that does the job

# inside Gemfile

# Add this
group :development do
  gem "hotwire-livereload"
end

Then run

bundle install
bin/rails livereload:install

Modified files

  • Note that this line was inserted inside app/views/layouts/application.html.erb:
<%= hotwire_livereload_tags if Rails.env.development? %>
  • Gemfile was modified - redis gem was uncommented to include it, then bundle install has been launched. So check that redis is running on your local machine.

  • Finally, config/cable.yml was modified to use redis.

Ensure redis is running on your machine by typing redis-cli ping in the terminal

Go! See changes live

Then launch your local web server with

bin/dev

And try to add tailwind classes, or modify HTML tag or content inside app/views/welcome/index.html.erb. Then notice how things change in your terminal.

16:00:17 web.1  | Hotwire::Livereload::ReloadChannel is transmitting the subscription confirmation

And more interestingly in your browser! Make some change in your HTML file (remove or add CSS classes, change text). Can you see them in the browser without hitting the F5 key ? Yay!

Problems

On my local machine, it's working so-so. Refreshing is not working all the time. So this method is not reliable enough on my side to use on it on wild, real Rails project.

That being said, a be thank you to the commiters of this gem, because it's free work, and a step in the right direction.

Next time I'll try to livereload, I need something more robust, and maybe also less invasive (whenever possible!).

Summary

Live (or hot-) reloading is not always possible in an easy way.

I appreciate how the community tries to circumvent this problem, there will probably a "part 2" for this tutorial, since everything didn't worked as expected 😬.

Sorry mates for this incomplete answer, see you soon!

David.

☝️ Join the junior webdev newsletter

We try to send you every week language-agnostic algorithm exercice and relevant blog articles

Read more