Skip to content

rails ruact:doctor

rails ruact:doctor is a diagnostic task that checks your ruact installation and reports ✓/✗ for each requirement.


Terminal window
rails ruact:doctor

Run it after installation, after upgrading the gem, or whenever something is not working as expected.


The doctor runs 6 checks in order:

Verifies that public/react-client-manifest.json exists (or the path configured via config.manifest_path).

✓ Manifest found at /your/app/public/react-client-manifest.json
✗ Manifest not found — run vite build

Fix: Run npm run build (production) or npm run dev (development, which generates the manifest automatically).


Attempts a TCP connection to localhost:5173 to verify the Vite dev server is accessible.

✓ Vite accessible at localhost:5173
✗ Vite not accessible at localhost:5173 — run npm run dev

Fix: Start the Vite dev server with npm run dev or bin/dev. In production, this check is informational — Vite does not run in production.


Checks that app/controllers/application_controller.rb includes Ruact::Controller.

✓ Ruact::Controller included in ApplicationController
✗ Ruact::Controller not included in ApplicationController

Fix: Add include Ruact::Controller to ApplicationController:

class ApplicationController < ActionController::Base
include Ruact::Controller
end

Checks that app/views/layouts/application.html.erb contains the Rails RSC root marker.

✓ React shell present in application.html.erb
✗ React shell missing from application.html.erb

Fix: Run the install generator to add the required layout:

Terminal window
rails generate ruact:install

Reports the current streaming mode and the detected web server.

✓ streaming: buffered (Puma)
✓ streaming: enabled (Puma)

This check always passes — it is informational. enabled means ActionController::Live is included and progressive streaming is active. buffered means the full payload is sent at once (still correct, but no progressive Suspense).


Scans config/initializers/**/*.rb and app/**/*.rb for any reference to the pre-rename gem name (regex form rails[_-]rsc) or its PascalCase constant equivalent. The gem went through a rails[_-]rscruact rename between v0.0.2 and v0.0.3; a leftover reference here means a host-side migration was incomplete. When something is found, the doctor prints the exact offending string (built from fragments at runtime; see gem/lib/ruact/doctor.rb constants LEGACY_CONST and LEGACY_GEM) plus the file path and line number, so you can jump to the call site and fix it.

When all references are clear, you see a ✓ No legacy … references found line. Otherwise each hit is printed with a prefix and the source location.

Fix: replace the legacy constant prefix with Ruact (matching Ruact::Controller, Ruact::Serializable, and friends), and update the Gemfile to require gem "ruact". See the Renamed section in CHANGELOG for the full migration table.


If all 6 checks pass, ruact:doctor exits 0. If any check fails:

  • Each failure is printed with
  • A hint is printed: Run rails generate ruact:install to fix configuration issues
  • The task exits with a non-zero status (can be used in CI)

.github/workflows/ci.yml
- name: Check ruact installation
run: bundle exec rails ruact:doctor

This catches misconfigured installations before they reach production.


The doctor is implemented as Ruact::Doctor — extracted from the Rake task for direct testability:

passed = Ruact::Doctor.run
# prints ✓/✗ for each check, returns true if all pass