К основному содержанию
скилл CX Codex

alba-inertia — скилл для Claude Code: что делает и как установить

Настраивает сериализацию в Inertia Rails через Alba и Typelizer. Генерирует типы TypeScript и заменяет as_json на типизированные ресурсы.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add inertia-rails/skills --skill alba-inertia -a claude-code
Открыть на GitHub

Что делает alba-inertia

Скилл учит агента работать с гемами alba, typelizer и alba-inertia. Вместо вызовов as_json в контроллерах создаются три вида ресурсов: сущности для моделей вроде UserResource, ресурсы конкретных страниц вроде UsersIndexResource и общие данные сессии в SharedPropsResource.

При включении этого скилла агент отказывается от явного вызова render inertia: и переходит на автоматическую сериализацию переменных инстанса. Например, @users = User.all в экшене автоматически сериализуется через соответствующий ресурс. Поддерживаются и опции Inertia Rails прямо в атрибутах ресурса: :defer, :optional, :once или merge.

Без гемов alba, typelizer и alba-inertia в Gemfile схема не заработает. Если имя ресурса не совпадает с моделью, обязательно указывать typelize_from, иначе Typelizer выведет типы в TypeScript как unknown.

Какие задачи решает

  • Заменить нетипизированный as_json на сериализаторы Alba
  • Автоматически генерировать интерфейсы TypeScript из моделей Rails
  • Настроить отложенную и однократную загрузку пропсов через опции :defer и :once
  • Организовать общие данные приложения в SharedPropsResource

Примеры запросов агенту

  • Создай UserResource на Alba с типизацией для Typelizer
  • Настрой UsersIndexResource для экшена контроллера с пагинацией
  • Добавь отложенный пропс с опцией defer в ресурс статистики

Как установить alba-inertia

1Через Skills CLI (Vercel)

npx skills add inertia-rails/skills --skill alba-inertia -a claude-code

2Вручную: положить файлы

~/.claude/skills/alba-inertia/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/alba-inertia/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о alba-inertia

Как установить alba-inertia в Claude Code?

Выполните команду npx skills add inertia-rails/skills --skill alba-inertia -a claude-code в терминале.

Чем alba-inertia заменяет стандартный рендеринг Inertia?

Скилл заменяет вызов render inertia: { ... } на конвенциональный рендеринг через переменные инстанса контроллера. Данные из @users автоматически проходят через сопоставленный ресурс.

Почему Typelizer генерирует тип unknown?

Это происходит, когда имя ресурса отличается от имени модели Rails. В таких классах нужно явно объявлять источник типов через макрос typelize_from ModelName.

Исходный текст

SKILL.md · MIT
---
name: alba-inertia
description: >-
  Alba serializers + Typelizer for type-safe Inertia Rails props with auto-generated TypeScript types. Use when
  serializing models for Inertia responses, setting up Alba resources, generating TypeScript types from Ruby, or
  using Inertia prop options (defer, once, merge, scroll) with Alba attributes. Replaces as_json with structured,
  auto-typed ApplicationResource, page resources, and shared props resources. When active, OVERRIDES the
  `render inertia: { ... }` pattern from other skills — use convention-based instance variable rendering instead.
---

# Alba + Typelizer for Inertia Rails

Requires: `alba`, `typelizer`, `alba-inertia` gems in Gemfile.

Alba serializers for Inertia props with auto-generated TypeScript types.
Replaces `as_json(only: [...])` with structured, type-safe resources.

**Before creating a resource, ask:**
- **Reusable data shape (user, course)?** → Entity resource (`UserResource`) — shared across pages
- **Page-specific props bundle?** → Page resource (`UsersIndexResource`) — one per controller action
- **Global data (auth, notifications)?** → Shared props resource (`SharedPropsResource`)

**NEVER:**
- Use `as_json` when Alba is set up — it bypasses type generation and creates untyped props
- Skip `typelize_from` when resource name differs from model — Typelizer can't infer column types and generates `unknown`
- Put `declare module` augmentations in `serializers/index.ts` — Typelizer-generated types go in `serializers/index.ts`, manual InertiaConfig goes in `globals.d.ts`

## Setup

### ApplicationResource (all resources inherit from this)

```ruby
# app/resources/application_resource.rb
class ApplicationResource
  include Alba::Resource

  helper Typelizer::DSL          # enables typelize, typelize_from
  helper Alba::Inertia::Resource # enables inertia: option on attributes

  include Rails.application.routes.url_helpers
end
```

### Controller Integration

```ruby
# app/controllers/inertia_controller.rb
class InertiaController < ApplicationController
  include Alba::Inertia::Controller

  inertia_share { SharedPropsResource.new(self).to_inertia }
end
```

## Resource Types

### Entity Resource (reusable data shape)

```ruby
# app/resources/user_resource.rb
class UserResource < ApplicationResource
  typelize_from User  # needed when resource name doesn't match model

  attributes :id, :name, :email

  typelize :string?
  attribute :avatar_url do |user|
    user.avatar.attached? ? rails_blob_path(user.avatar, only_path: true) : nil
  end
end
```

### Page Resource (page-specific props)

```ruby
# app/resources/users/index_resource.rb
# Naming convention: {Controller}{Action}Resource
class UsersIndexResource < ApplicationResource
  has_many :users, resource: UserResource

  typelize :string
  attribute :search do |obj, _|
    obj.params.dig(:filters, :search)
  end
end
```

### Shared Props Resource

Requires Rails `Current` attributes (e.g., `Current.user`) to be configured —
see [CurrentAttributes](https://api.rubyonrails.org/classes/ActiveSupport/CurrentAttributes.html).

```ruby
# app/resources/shared_props_resource.rb
class SharedPropsResource < ApplicationResource
  one :auth, source: proc { Current }

  attribute :unread_messages_count, inertia: { always: true } do
    Current.user&.unread_count || 0
  end

  has_many :live_now, resource: LiveSessionsResource,
    inertia: { once: { expires_in: 5.minutes } }
end
```

## Convention-Based Rendering

With `Alba::Inertia::Controller`, instance variables auto-serialize:

```ruby
class UsersController < InertiaController
  def index
    @users = User.all        # auto-serialized via UserResource
    @filters = filter_params  # plain data passed through
    # Auto-detects UsersIndexResource
  end

  def show
    @user = User.find(params[:id])
    # Auto-detects UsersShowResource
  end
end
```

## Typelizer + Type Generation

`typelize_from` tells Typelizer which model to infer column types from — needed when
resource name doesn't match model. For computed attributes, declare types explicitly:

```ruby
class AuthorResource < ApplicationResource
  typelize_from User

  attributes :id, :name, :email

  typelize :string?                                  # next attribute is string | undefined
  attribute :avatar_url do |user|
    rails_storage_proxy_path(user.avatar) if user.avatar.attached?
  end

  typelize filters: "{category: number}"            # inline TS type
end
```

Types auto-generate when Rails server runs. Manual: `bin/rake typelizer:generate`.

## Inertia Prop Options in Alba

The `inertia:` option on attributes/associations maps to `InertiaRails` prop types:

```ruby
attribute :stats, inertia: :defer           # InertiaRails.defer
has_many :users, inertia: :optional         # InertiaRails.optional
has_many :countries, inertia: :once         # InertiaRails.once
has_many :items, inertia: { merge: true }   # InertiaRails.merge
attribute :csrf, inertia: { always: true }  # InertiaRails.always
```

**MANDATORY — READ ENTIRE FILE** when using grouped defer, merge with `match_on`,
scroll props, or combining multiple options:
[`references/prop-options.md`](references/prop-options.md) (~60 lines) — full syntax
for all `inertia:` option variants and `inertia_prop` alternative syntax.

**Do NOT load** for basic `inertia: :defer`, `inertia: :optional`, or
`inertia: :once` — the shorthand above is sufficient.

## Troubleshooting

| Symptom | Cause | Fix |
|---------|-------|-----|
| TypeScript type is all `unknown` | Missing `typelize_from` | Add `typelize_from ModelName` when resource name doesn't match model |
| `inertia:` option has no effect | Missing helper | Ensure `helper Alba::Inertia::Resource` is in `ApplicationResource` |
| Types not regenerating | Server not running | Typelizer watches files in dev only. Run `bin/rake typelizer:generate` manually |
| `NoMethodError` for `typelize` | Missing helper | Ensure `helper Typelizer::DSL` is in `ApplicationResource` |
| Convention-based rendering picks wrong resource | Naming mismatch | Resource must be `{Controller}{Action}Resource` (e.g., `UsersIndexResource` for `UsersController#index`) |
| `to_inertia` undefined | Missing include | Controller needs `include Alba::Inertia::Controller` |

## Related Skills
- **Prop types** → `inertia-rails-controllers` (defer, once, merge, scroll)
- **TypeScript config** → `inertia-rails-typescript` (InertiaConfig in globals.d.ts)

© inertia-rails · MIT · inertia-rails/skills

Похожие скиллы

Все скиллы по теме «Бэкенд и API» →
laravel-inertia-react AsyrafHussin Скилл с готовыми правилами для страниц Inertia, форм на useForm и общих данных в связке Laravel и React. CX Codex +1 2 000установок safe-action-hooks next-safe-action Скилл подсказывает агенту, какой хук next-safe-action взять для формы или оптимистичного UI и как связать его с серверным действием. CX Codex +1 1 200установок sales-app-extensibility vtex Помогает разрабатывать, настраивать и собирать расширения для VTEX Sales App. Проводит через семь этапов от проверки структуры проекта до деплоя. CX Codex +1 856установок inngest-realtime inngest Скилл учит агента публиковать обновления из durable-функций Inngest в живой интерфейс: статусы заказов, стриминг токенов, логи и подтверждения от пользователя. CX Codex +1 797установок encore-frontend encoredev Скилл связывает фронтенд на React, Next.js, Vue или Svelte с бэкендом Encore.ts: генерация типизированного клиента, CORS и токены авторизации. CX Codex +1 763установок build-integration GitbookIO Скилл помогает создавать и публиковать интеграции для GitBook. Пригодится, когда нужно добавить кастомный блок в редактор или связать документацию с внешним API по OAuth. CX Codex +1 565установок

Из того же набора9

inertia-rails-architecture Задаёт серверные шаблоны для Rails + Inertia.js + React и разводит по нужным скиллам, когда вы строите страницу, форму или CRUD. CX Codex +1 537установок inertia-rails-pages Скилл для работы со страницами Inertia Rails: постоянные лейауты, навигация через Link и router, состояние из URL, отложенная загрузка и бесконечный скролл. CX Codex +1 504установок inertia-rails-controllers Подсказывает агенту, как правильно отдавать данные из Rails-контроллеров в Inertia.js: render inertia, типы пропсов, общие данные, flash и ошибки валидации. CX Codex +1 491установок inertia-rails-forms Скилл для работы с формами Inertia.js + Rails: создание, редактирование, удаление, визарды и загрузка файлов. Пригодится, когда нужно связать форму с контроллером Rails. CX Codex +1 486установок inertia-rails-typescript Скилл настраивает строгую типизацию TypeScript в Inertia Rails для React, Vue и Svelte. Помогает исправить ошибки TS2344 и TS2339. CX Codex +1 468установок inertia-rails-testing Скилл для тестов Inertia Rails на RSpec и Minitest: проверка компонента, пропсов и flash без ручного разбора JSON. CX Codex +1 465установок shadcn-inertia Адаптирует компоненты shadcn/ui для связки Inertia.js, Ruby on Rails и React вместо Next.js. Помогает переписать формы и диалоги без react-hook-form. CX Codex +1 432установок inertia-rails-setup Скилл анализирует стек Inertia Rails в проекте, подбирает недостающие библиотеки и генерирует блок конфигурации в CLAUDE.md. Помогает при первом старте или смене инструментов. CX Codex +1 419установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой