sinatra-inertia
Sinatra で Inertia.js v2 protocol を扱う adapter です。アプリケーションのルートは Sinatra らしく render 'Page' と書き、page object、partial reload、deferred props、validation error sweep は gem が引き受けます。
役割
- 初回 GET は ERB layout に
@page_jsonを渡し、以降の Inertia visit は JSON page object を返します。 X-Inertia-Versionmismatch、303 redirect promotion、partial reload、deferred props、merge props を処理します。- CSRF double-submit cookie と validation errors の one-redirect sweep を提供します。
セットアップ
gem 'sinatra-inertia', '~> 0.1'
require 'sinatra/base'
require 'sinatra/inertia'
class App < Sinatra::Base
register Sinatra::Inertia
set :page_version, ENV.fetch('ASSETS_VERSION', '1')
set :page_layout, :layout
share_props do
{ flash: flash_payload, csrfToken: csrf_token }
end
end
ページを render する
get '/' do
render 'Todos/Index',
todos: -> { todos },
stats: defer(group: 'meta') { todo_stats }
end
route 内に Inertia 固有の protocol 語彙を置かないのが推奨形です。互換 API として inertia / inertia_share / Inertia.defer も残っています。
validation errors
post '/todos' do
if params[:title].to_s.strip.empty?
page_errors title: 'title is required'
redirect to('/'), 303
end
# write model...
redirect to('/'), 303
end
example
完全な Workers + D1 + React の例は examples/inertia-todo です。production deploy は inertia-todo.kazu-san.workers.dev で動いています。
できること / できないこと
| できること | できないこと | |
|---|---|---|
| Page protocol | Inertia v2 page object、partial reload、deferred props、merge props | Rails controller / ActiveSupport 前提の API |
| Frontend | React / Vue / Svelte など Inertia client と接続 | クライアント bundle の生成そのもの |
| Workers | homura build の auto-await と D1 route props に対応 | ブラウザ history / component rendering をサーバーだけで完結 |