mcpField
I
inertia-rails-setup

inertia-rails-setup

github.com/cole-robertsonDevelopment3879 installsUpdated 32w ago
Repository

About inertia-rails-setup

inertia-rails-setup is a setup guide for adding Inertia.js to Ruby on Rails, for developers choosing React, Vue, or Svelte. It covers starter kits as well as generator-based and manual configuration.

Key features

  1. 01Start from React, Vue, or Svelte kits
  2. 02Install with the Rails generator
  3. 03Configure Inertia and Vite
  4. 04Set up shared data and page components
  5. 05Review configuration and upgrade notes

Use cases

  1. 01Create a new Rails app with Inertia.js
  2. 02Add Inertia.js to an existing Rails app
  3. 03Configure frontend pages and shared props
  4. 04Upgrade an existing project to Inertia.js v3

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/cole-robertson/inertia-rails-skills --skill inertia-rails-setup

After installing, type/inertia-rails-setupin Claude Code to confirm it loaded.

Details

From the project README

Inertia Rails Setup

This skill helps you set up Inertia.js in a Ruby on Rails application with your choice of frontend framework.

Recommended: Official Starter Kits

For new projects, the fastest way to get started is cloning an official starter kit. These include authentication, shadcn/ui components, TypeScript, and optional SSR support out of the box.

React Starter Kit (Recommended)
git clone https://github.com/inertia-rails/react-starter-kit myapp
cd myapp
bin/setup

Includes:

  • React 19 + TypeScript
  • shadcn/ui component library (20+ components)
  • User authentication (login, register, password reset)
  • Settings pages (profile, password, email, sessions, appearance)
  • Multiple layouts (sidebar, header, auth variants)
  • Dark mode support
  • Kamal deployment config
  • Optional SSR support
  • Flash messages with Sonner toasts
Vue Starter Kit
git clone https://github.com/inertia-rails/vue-starter-kit myapp
cd myapp
bin/setup
Svelte Starter Kit
git clone https://github.com/inertia-rails/svelte-starter-kit myapp
cd myapp
bin/setup
Customizing the Starter Kit

After cloning:

  1. Rename the app:

    # Update config/application.rb
    module YourAppName
      class Application < Rails::Application
    
  2. Update database config:

    # Edit config/database.yml with your settings
    
  3. Remove example pages you don't need:

    # Delete from app/frontend/pages/ and corresponding controllers
    
  4. Add your own pages:

    bin/rails generate controller Products index show
    # Create app/frontend/pages/products/index.tsx
    
  5. Customize the layout:

    • Edit app/frontend/layouts/app-layout.tsx for main app
    • Edit app/frontend/components/nav-main.tsx for navigation

Alternative: Generator Setup

If you prefer starting from scratch or adding Inertia to an existing Rails app:

Quick Setup
# Create new Rails app (if needed)
rails new myapp --skip-javascript

# Add inertia_rails gem
bundle add inertia_rails

# Run the generator
bin/rails generate inertia:install

The generator will prompt you to select:

  • Frontend framework (React, Vue, or Svelte)
  • TypeScript support
  • Tailwind CSS integration

Manual Setup Steps

1. Add the Gem
# Gemfile
gem 'inertia_rails'
bundle install
2. Install Vite Rails (if not present)
bundle add vite_rails
bundle exec vite install
3. Configure the Root Layout

Create or update app/views/layouts/application.html.erb:

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <%= csp_meta_tag %>
    <%= inertia_ssr_head %>
    <%= vite_client_tag %>
    <%= vite_javascript_tag 'application' %>
  </head>
  <body>
    <%= yield %>
  </body>
</html>
4. Install Frontend Dependencies

For React:

npm install @inertiajs/react @inertiajs/vite react react-dom

For Vue 3:

npm install @inertiajs/vue3 @inertiajs/vite vue

For Svelte:

npm install @inertiajs/svelte @inertiajs/vite svelte
5. Configure the Frontend Entry Point

Create app/frontend/entrypoints/application.js:

React:

import { createInertiaApp } from '@inertiajs/react'
import { createRoot } from 'react-dom/client'
import { inertia } from '@inertiajs/vite'

createInertiaApp({
  resolve: inertia.resolvePages('../pages'),
  setup({ el, App, props }) {
    createRoot(el).render(<App {...props} />)
  },
})

Vue 3:

import { createApp, h } from 'vue'
import { createInertiaApp } from '@inertiajs/vue3'
import { inertia } from '@inertiajs/vite'

createInertiaApp({
  resolve: inertia.resolvePages('../pages'),
  setup({ el, App, props, plugin }) {
    createApp({ render: () => h(App, props) })
      .use(plugin)
      .mount(el)
  },
})

Svelte:

import { createInertiaApp } from '@inertiajs/svelte'
import { inertia } from '@inertiajs/vite'

createInertiaApp({
  resolve: inertia.resolvePages('../pages'),
  setup({ el, App }) {
    new App({ target: el })
  },
})
6. Create the Pages Directory
mkdir -p app/frontend/pages
7. Configure the Initializer

Create config/initializers/inertia_rails.rb:

# frozen_string_literal: true

InertiaRails.configure do |config|
  # Asset versioning
  config.version = -> { ViteRuby.digest }

  # Flash keys exposed to frontend
  config.flash_keys = %i[notice alert]

  # Required for Inertia.js v3
  config.use_script_element_for_initial_page = true
  config.use_data_inertia_head_attribute = true
  config.always_include_errors_hash = true

  # Deep merge shared data with page props
  # config.deep_merge_shared_data = true

  # Encrypt history for sensitive data (requires HTTPS)
  # config.encrypt_history = Rails.env.production?
end
8. Set Up Shared Data

In app/controllers/application_controller.rb:

class ApplicationController < ActionController::Base
  inertia_share do
    {
      flash: {
        notice: flash.notice,
        alert: flash.alert
      },
      auth: {
        user: current_user&.as_json(only: [:id, :name, :email])
      }
    }
  end
end
9. Create Your First Page

Controller:

# app/controllers/home_controller.rb
class HomeController < ApplicationController
  def index
    render inertia: { message: 'Welcome to Inertia Rails!' }
  end
end

Route:

# config/routes.rb
Rails.application.routes.draw do
  root 'home#index'
end

Page Component (React):

// app/frontend/pages/home/index.jsx
export default function Home({ message }) {
  return (
    <div>
      <h1>{message}</h1>
    </div>
  )
}

Page Component (Vue):

<!-- app/frontend/pages/home/index.vue -->
<script setup>
defineProps(['message'])
</script>

<template>
  <div>
    <h1>{{ message }}</h1>
  </div>
</template>
10. Start the Development Servers
# Terminal 1: Rails server
bin/rails server

# Terminal 2: Vite dev server
bin/vite dev

Configuration Options Reference

OptionDefaultDescription
versionnilAsset version for cache busting
layout'application'Default layout template
flash_keys[:notice, :alert]Flash keys to share
deep_merge_shared_datafalseDeep merge props
encrypt_historyfalseEncrypt browser history
ssr_enabledfalseEnable SSR
ssr_url'http://localhost:13714'SSR server URL
default_renderfalseAuto-render Inertia
root_dom_id'app'Root element ID
use_script_element_for_initial_pagefalseUse <script> tag for initial page data (required for v3)
use_data_inertia_head_attributefalseUse data-inertia attribute for head tags (required for v3)
always_include_errors_hashnilAlways include errors object in page props
prop_transformeridentityTransform prop keys (e.g., camelCase)
component_path_resolver"path/action"Custom component name resolution
parent_controller'::ApplicationController'Base controller for static routes
expose_shared_prop_keystrueInclude shared prop keys in page metadata
precognition_prevent_writesfalsePrevent DB writes during precognition

Environment Variables

All config options can be set via INERTIA_ prefixed env vars:

INERTIA_SSR_ENABLED=true
INERTIA_ENCRYPT_HISTORY=true

Upgrading to Inertia.js v3

If upgrading an existing Inertia.js v2 project:

Required Configuration Changes

Add these to your Inertia Rails initializer:

config.use_script_element_for_initial_page = true
config.use_data_inertia_head_attribute = true
config.always_include_errors_hash = true
Breaking Changes
  • React 19+ required
  • Svelte 5+ with runes syntax required
  • ES2022 build target required
  • ESM-only — no CommonJS
  • Axios removed — uses built-in XHR (use axiosAdapter() to keep Axios)
  • Event renames: invalid → httpException, exception → networkError
  • router.cancel() → router.cancelAll()
  • Head attribute: inertia → data-inertia
Install the Vite Plugin
npm install @inertiajs/vite

Update vite.config.js:

import inertia from '@inertiajs/vite'

export default defineConfig({
  plugins: [
    inertia(),
    // ... other plugins
  ],
})

The Vite plugin provides:

  • Automatic page component resolution
  • Simplified SSR setup (no separate entry point in development)
  • withApp callback for providers/plugins

Troubleshooting

"Cannot find module '@inertiajs/react'"

Run npm install to install dependencies.

Blank page with no errors

Check browser console for JavaScript errors. Ensure Vite dev server is running.

Props not updating

Ensure you're using render inertia: not render json:.

CSRF token errors

Inertia handles CSRF automatically. Ensure protect_from_forgery is enabled.

Comments

Markdown supported