Rails_ai_agents rails-architecture

install
source · Clone the upstream repo
git clone https://github.com/ThibautBaissac/rails_ai_agents
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ThibautBaissac/rails_ai_agents "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/rails-architecture" ~/.claude/skills/thibautbaissac-rails-ai-agents-rails-architecture && rm -rf "$T"
manifest: .claude/skills/rails-architecture/SKILL.md
source content

Modern Rails 8 Architecture Patterns

Architecture Decision Tree

Where should this code go?
|
+- View/display formatting?       -> Presenter (@presenter-agent)
+- Complex business logic?        -> Service Object (@service-agent)
+- Complex database query?        -> Query Object (@query-agent)
+- Shared behavior across models? -> Concern (/rails-concern skill)
+- Authorization logic?           -> Policy (@policy-agent)
+- Reusable UI with logic?        -> ViewComponent (@viewcomponent-agent)
+- Async/background work?         -> Job (@job-agent, /solid-queue-setup skill)
+- Complex form (multi-model)?    -> Form Object (@form-agent)
+- Transactional email?           -> Mailer (@mailer-agent)
+- Real-time/WebSocket?           -> Channel (/action-cable-patterns skill)
+- Data validation only?          -> Model (@model-agent)
+- HTTP request/response only?    -> Controller (@controller-agent)

Layer Responsibilities

LayerResponsibilityShould NOT contain
ControllerHTTP, params, responseBusiness logic, queries
ModelData, validations, relationsDisplay logic, HTTP
ServiceBusiness logic, orchestrationHTTP, display logic
QueryComplex database queriesBusiness logic
PresenterView formatting, badgesBusiness logic, queries
PolicyAuthorization rulesBusiness logic
ComponentReusable UI encapsulationBusiness logic
JobAsync processingHTTP, display logic
FormComplex form handlingPersistence logic
MailerEmail compositionBusiness logic
ChannelWebSocket communicationBusiness logic

When NOT to Abstract

SituationKeep It SimpleDon't Create
Simple CRUD (< 10 lines)Keep in controllerService object
Used only onceInline the codeAbstraction
Simple query with 1-2 conditionsModel scopeQuery object
Basic text formattingHelper methodPresenter
Single model form
form_with model:
Form object
Simple partial without logicPartialViewComponent

When TO Abstract

SignalAction
Same code in 3+ placesExtract to concern/service
Controller action > 15 linesExtract to service
Model > 300 linesExtract concerns
Complex conditionalsExtract to policy/service
Query joins 3+ tablesExtract to query object
Form spans multiple modelsExtract to form object

See /extraction-timing skill for detailed extraction guidance.

Core Patterns

Skinny Controllers

# GOOD: Thin controller delegates to service
class OrdersController < ApplicationController
  def create
    result = Orders::CreateService.call(user: current_user, params: order_params)
    if result.success?
      redirect_to result.data, notice: t(".success")
    else
      flash.now[:alert] = result.error
      render :new, status: :unprocessable_entity
    end
  end
end

Result Objects for Services

All services return a consistent Result object:

Result = Data.define(:success, :data, :error) do
  def success? = success
  def failure? = !success
end

Multi-Tenancy by Default

# GOOD: Scoped through account
def index
  @events = current_account.events.recent
end

Rails 8 Specific Features

FeaturePurposeSkill/Agent
Authentication
has_secure_password
generator
/authentication-flow
Background JobsSolid Queue (database-backed)/solid-queue-setup, @job-agent
Real-timeAction Cable + Solid Cable/action-cable-patterns
CachingSolid Cache (database-backed)/caching-strategies
AssetsPropshaft + Import Maps(built-in)
DeploymentKamal 2 + Thruster(built-in)

Testing Strategy by Layer

LayerTest TypeFocus
ModelUnitValidations, scopes, methods
ServiceUnitBusiness logic, edge cases
QueryUnitQuery results, tenant isolation
PresenterUnitFormatting, HTML output
ControllerRequestIntegration, HTTP flow
ComponentComponentRendering, variants
PolicyUnitAuthorization rules
SystemE2ECritical user paths

New Feature Checklist

  1. Model - Define data structure (@migration-agent, @model-agent)
  2. Policy - Add authorization rules (@policy-agent)
  3. Service - Create for complex logic (@service-agent)
  4. Query - Add for complex queries (@query-agent)
  5. Controller - Keep it thin (@controller-agent)
  6. Presenter - Format for display (@presenter-agent)
  7. Component - Build reusable UI (@viewcomponent-agent)
  8. Mailer - Add transactional emails (@mailer-agent)
  9. Job - Add background processing (@job-agent)

References