Rails Code Generation Standards
Practical standards for AI-assisted Rails development from Evil Martians. Generated code should be so simple and clear that reading it feels like reading well-written documentation.
Core Principles
- Follow Rails conventions - Leverage the framework, don't fight it
- Use domain language - Name models after business concepts (Participant vs User, Cloud vs GeneratedImage)
- Keep logic at appropriate layers - Models for business logic, controllers for HTTP, jobs for async
- Write readable code - Code should be self-documenting without comments
- Normalize data properly - One concern per table, use foreign keys and constraints
Quick Reference
File Structure
app/models/ # Including namespaced classes (Cloud::CardGenerator)
app/controllers/ # Namespaced for auth scoping (Participant::CloudsController)
app/jobs/ # Background work with ActiveJob
app/forms/ # Multi-model operations only
app/policies/ # Complex authorization (ActionPolicy)
app/views/ # ERB + ViewComponent
app/frontend/ # Stimulus controllers, styles
config/configs/ # Anyway Config classes
Critical: No app/services/, app/contexts/, or app/operations/ folders. Extract complex operations to namespaced model classes.
Model Organization Order
- Gems/DSL extensions
- Associations (with
counter_cache: true)
- Enums (for state machines)
- Normalizations (Rails 7.1+)
- Validations
- Scopes
- Callbacks
- Delegations
- Public methods
- Private methods
Controller Target
5-10 lines per action. No business logic. Guard clauses for early returns.
def create
return head :forbidden unless current_participant.can_create_cloud?
@cloud = current_participant.clouds.create!(cloud_params)
CloudProcessingJob.perform_later(@cloud)
redirect_to @cloud
end
Technology Stack
Required gems: Rails, Puma, Propshaft, PostgreSQL, Hotwire (Turbo + Stimulus), ViewComponent, Vite Rails, SolidQueue, ActionPolicy, Anyway Config, RSpec + FactoryBot, Standard, Nanoid + FriendlyID, HTTParty
Forbidden: Devise, CanCanCan, ActiveAdmin, service object gems, state machine gems, dry-types/Virtus
Building Block References
Consult these reference files for detailed patterns:
| Reference |
Content |
references/stack.md |
Complete gem list, file structure, forbidden patterns |
references/models.md |
Model organization, enums, validations, extraction patterns |
references/controllers.md |
Thin controllers, namespacing, guard clauses |
references/database.md |
Schema design, constraints, indexes, migrations |
references/jobs.md |
ActiveJob::Continuable, workflow orchestration |
references/views.md |
Hotwire, ViewComponent, Stimulus patterns |
references/forms-queries.md |
Form objects, query objects, when to use |
references/testing.md |
RSpec organization, what to test |
references/configuration.md |
Anyway Config patterns, environment variables |
references/anti-patterns.md |
Common mistakes with alternatives, deployment checklist |
Decision Flowchart
Where does this logic belong?
- Single model operation → Model method
- Multi-model transaction → Form object
- External API call → Namespaced model class (e.g.,
Cloud::CardGenerator)
- Async work → Job (orchestrates, doesn't execute)
- Complex query → Query object or scope
- Authorization → Policy (ActionPolicy)
- Configuration → Anyway Config class
When to extract from model?
- Method > 15 lines → Extract to namespaced class
- Calls external API → Extract to namespaced class
- Shared across models → Extract to concern or module
Code Generation Checklist
Before generating Rails code, verify:
Usage
When generating Rails code:
- Check
references/stack.md to verify gem choices
- Follow patterns in the relevant building block reference
- Consult
references/anti-patterns.md to avoid common mistakes
- Run through the checklist above before finalizing
For specific patterns, read the appropriate reference file based on what component is being generated.
Converted and distributed by TomeVault — claim your Tome and manage your conversions.
1---2name: rails-code-generation3description: This skill should be used when the user asks to "generate Rails code", "create a model", "create a controller", "add a migration", "write Rails tests", "set up background jobs", "configure Rails app", or discusses Rails conventions, best practices, ActiveRecord patterns, Hotwire/Stimulus, ViewComponent, RSpec testing, or Ruby on Rails development. Based on Evil Martians' AGENTS.md. Use when this capability is needed.4---56# Rails Code Generation Standards78Practical standards for AI-assisted Rails development from Evil Martians. Generated code should be so simple and clear that reading it feels like reading well-written documentation.910## Core Principles11121. **Follow Rails conventions** - Leverage the framework, don't fight it132. **Use domain language** - Name models after business concepts (Participant vs User, Cloud vs GeneratedImage)143. **Keep logic at appropriate layers** - Models for business logic, controllers for HTTP, jobs for async154. **Write readable code** - Code should be self-documenting without comments165. **Normalize data properly** - One concern per table, use foreign keys and constraints1718## Quick Reference1920### File Structure2122```23app/models/ # Including namespaced classes (Cloud::CardGenerator)24app/controllers/ # Namespaced for auth scoping (Participant::CloudsController)25app/jobs/ # Background work with ActiveJob26app/forms/ # Multi-model operations only27app/policies/ # Complex authorization (ActionPolicy)28app/views/ # ERB + ViewComponent29app/frontend/ # Stimulus controllers, styles30config/configs/ # Anyway Config classes31```3233**Critical**: No `app/services/`, `app/contexts/`, or `app/operations/` folders. Extract complex operations to namespaced model classes.3435### Model Organization Order36371. Gems/DSL extensions382. Associations (with `counter_cache: true`)393. Enums (for state machines)404. Normalizations (Rails 7.1+)415. Validations426. Scopes437. Callbacks448. Delegations459. Public methods4610. Private methods4748### Controller Target49505-10 lines per action. No business logic. Guard clauses for early returns.5152```ruby53def create54 return head :forbidden unless current_participant.can_create_cloud?5556 @cloud = current_participant.clouds.create!(cloud_params)57 CloudProcessingJob.perform_later(@cloud)58 redirect_to @cloud59end60```6162### Technology Stack6364**Required gems**: Rails, Puma, Propshaft, PostgreSQL, Hotwire (Turbo + Stimulus), ViewComponent, Vite Rails, SolidQueue, ActionPolicy, Anyway Config, RSpec + FactoryBot, Standard, Nanoid + FriendlyID, HTTParty6566**Forbidden**: Devise, CanCanCan, ActiveAdmin, service object gems, state machine gems, dry-types/Virtus6768## Building Block References6970Consult these reference files for detailed patterns:7172| Reference | Content |73|-----------|---------|74| `references/stack.md` | Complete gem list, file structure, forbidden patterns |75| `references/models.md` | Model organization, enums, validations, extraction patterns |76| `references/controllers.md` | Thin controllers, namespacing, guard clauses |77| `references/database.md` | Schema design, constraints, indexes, migrations |78| `references/jobs.md` | ActiveJob::Continuable, workflow orchestration |79| `references/views.md` | Hotwire, ViewComponent, Stimulus patterns |80| `references/forms-queries.md` | Form objects, query objects, when to use |81| `references/testing.md` | RSpec organization, what to test |82| `references/configuration.md` | Anyway Config patterns, environment variables |83| `references/anti-patterns.md` | Common mistakes with alternatives, deployment checklist |8485## Decision Flowchart8687**Where does this logic belong?**8889- Single model operation → Model method90- Multi-model transaction → Form object91- External API call → Namespaced model class (e.g., `Cloud::CardGenerator`)92- Async work → Job (orchestrates, doesn't execute)93- Complex query → Query object or scope94- Authorization → Policy (ActionPolicy)95- Configuration → Anyway Config class9697**When to extract from model?**9899- Method > 15 lines → Extract to namespaced class100- Calls external API → Extract to namespaced class101- Shared across models → Extract to concern or module102103## Code Generation Checklist104105Before generating Rails code, verify:106107- [ ] Models named after business domain concepts?108- [ ] Model follows organization order?109- [ ] States implemented as enums?110- [ ] Controllers under 10 lines per action?111- [ ] Complex logic extracted appropriately?112- [ ] Database normalized with FK constraints?113- [ ] Counter caches on has_many associations?114- [ ] Workflows orchestrated through jobs?115- [ ] Configuration via Anyway Config (not ENV)?116- [ ] Tests organized by type (model/request/system)?117118## Usage119120When generating Rails code:1211221. Check `references/stack.md` to verify gem choices1232. Follow patterns in the relevant building block reference1243. Consult `references/anti-patterns.md` to avoid common mistakes1254. Run through the checklist above before finalizing126127For specific patterns, read the appropriate reference file based on what component is being generated.128129---130> Converted and distributed by [TomeVault](https://tomevault.io/claim/florinpopacodes) — claim your Tome and manage your conversions.131<!-- tomevault:4.0:skill_md:2026-04-15 -->