Community Ruby on Rails Design System Best Practices
Comprehensive design system guide for Ruby on Rails applications, maintained by Community. Contains 51 rules across 9 categories, prioritized by impact to guide automated refactoring and code generation. Covers the full Rails frontend stack: Turbo (Drive, Frames, Streams), Stimulus, ERB partials, design tokens, form builders, and view helpers. Complements rails-dev (controllers, models, queries) and tailwind (CSS patterns) by covering the systematic UI component architecture layer.
When to Apply
Reference these guidelines when:
- Deciding whether to extract a partial, component, or helper
- Defining design tokens with Tailwind CSS
@theme
- Creating or refactoring ERB partials with explicit locals
- Decomposing pages into Turbo Frames for targeted updates
- Using Turbo Streams for multi-element CRUD updates
- Coordinating Turbo navigation with Stimulus controllers
- Building ViewComponent or Phlex components for complex UI
- Implementing a custom FormBuilder for consistent forms
- Writing view helpers for badges, icons, and conditional classes
- Adding Stimulus controllers for interactive behaviors
- Managing JavaScript dependencies with Import Maps
- Auditing the codebase for UI duplication and naming drift
Rule Categories by Priority
| Priority |
Category |
Impact |
Prefix |
| 1 |
Design Decisions |
CRITICAL |
decide- |
| 2 |
Design Tokens |
CRITICAL |
token- |
| 3 |
Turbo Integration |
HIGH |
turbo- |
| 4 |
Partial Patterns |
HIGH |
partial- |
| 5 |
Component Architecture |
HIGH |
comp- |
| 6 |
Form System |
MEDIUM-HIGH |
form- |
| 7 |
Helper Patterns |
MEDIUM |
helper- |
| 8 |
Stimulus Behaviors |
MEDIUM |
stim- |
| 9 |
Consistency & Organization |
LOW-MEDIUM |
org- |
Quick Reference
1. Design Decisions (CRITICAL)
decide-three-uses-rule - Extract only after a pattern appears in 3+ places
decide-partial-vs-component - Choose partials for simple reuse, components for complex logic
decide-helper-vs-partial - Use helpers for tiny HTML fragments, partials for layout blocks
decide-prove-then-extract - Prove patterns in production before abstracting
decide-avoid-wrapper-components - Avoid thin wrappers that add indirection without value
decide-design-system-scope - Scope the design system to what the app actually needs
2. Design Tokens (CRITICAL)
token-tailwind-theme - Define tokens with Tailwind CSS @theme directive
token-semantic-color-names - Name colors by purpose, not appearance
token-spacing-scale - Use a constrained spacing scale for consistent layout
token-typography-scale - Define a typography scale for headings, body, and UI text
token-component-tokens - Create component-level tokens for repeated patterns
token-share-tokens-with-ruby - Share token values between CSS and Ruby when needed
3. Turbo Integration (HIGH)
turbo-drive-defaults - Let Turbo Drive handle navigation by default
turbo-frame-decompose - Decompose pages into Turbo Frames for targeted updates
turbo-frame-naming - Name Turbo Frames with dom_id conventions
turbo-frame-vs-stream - Choose Turbo Frames vs Turbo Streams by scope of change
turbo-stream-crud - Use Turbo Streams for multi-element page updates
turbo-stimulus-coordination - Coordinate Turbo and Stimulus without conflicts
4. Partial Patterns (HIGH)
partial-explicit-locals - Always pass locals explicitly to partials
partial-presenter-objects - Use presenter objects to encapsulate view logic
partial-naming-conventions - Name partials by what they render, prefixed with underscore
partial-yield-blocks - Use yield blocks for flexible partial layouts
partial-collection-with-spacer - Use collection rendering with spacer templates
partial-shared-directory - Place cross-controller partials in app/views/shared
5. Component Architecture (HIGH)
comp-when-to-use - Use components when partials outgrow simple rendering
comp-explicit-args - Define explicit typed arguments for every component
comp-slots-for-markup - Use slots for caller-provided markup blocks
comp-test-rendered-output - Test components by asserting on rendered HTML
6. Form System (MEDIUM-HIGH)
form-custom-builder - Create a custom FormBuilder for consistent form rendering
form-set-default-builder - Set the custom builder as the application default
form-error-display - Display field errors inline with consistent markup
form-accessible-labels - Generate accessible labels and ARIA attributes automatically
form-group-wrapper - Wrap label + input + error in a consistent group element
form-button-consistency - Standardize submit buttons through the form builder
7. Helper Patterns (MEDIUM)
helper-tag-helpers - Use tag helpers for small generated HTML fragments
helper-conditional-classes - Use class_names for conditional CSS classes
helper-icon-helper - Create an icon helper for consistent icon rendering
helper-badge-pattern - Build a badge helper for status indicators
helper-scope-to-domain - Scope helpers to specific domains, not generic utilities
8. Stimulus Behaviors (MEDIUM)
stim-general-purpose - Write general-purpose controllers, not one-off scripts
stim-data-attribute-config - Configure behavior through data attributes, not JavaScript
stim-small-controllers - Keep controllers small and single-responsibility
stim-composable-controllers - Compose multiple controllers on one element
stim-use-outlets - Use outlets for cross-controller communication
stim-leverage-library - Use stimulus-components before writing custom controllers
9. Consistency & Organization (LOW-MEDIUM)
org-naming-conventions - Follow consistent naming across partials, components, and helpers
org-file-structure - Organize design system files in predictable locations
org-deduplication-audit - Periodically audit views for duplicated patterns
org-import-maps - Use Import Maps for zero-build JavaScript delivery
org-preview-with-lookbook - Preview components with Lookbook in development
org-document-design-decisions - Document design system decisions in ADRs
How to Use
Read individual reference files for detailed explanations and code examples:
- Section definitions - Category structure and impact levels
- Rule template - Template for adding new rules
Reference Files
| File |
Description |
| references/_sections.md |
Category definitions and ordering |
| assets/templates/_template.md |
Template for new rules |
| metadata.json |
Version and reference information |
1---2name: rails-design-system3description: Community Ruby on Rails Design System Best Practices4---5# Community Ruby on Rails Design System Best Practices67Comprehensive design system guide for Ruby on Rails applications, maintained by Community. Contains 51 rules across 9 categories, prioritized by impact to guide automated refactoring and code generation. Covers the full Rails frontend stack: Turbo (Drive, Frames, Streams), Stimulus, ERB partials, design tokens, form builders, and view helpers. Complements `rails-dev` (controllers, models, queries) and `tailwind` (CSS patterns) by covering the systematic UI component architecture layer.89## When to Apply1011Reference these guidelines when:12- Deciding whether to extract a partial, component, or helper13- Defining design tokens with Tailwind CSS `@theme`14- Creating or refactoring ERB partials with explicit locals15- Decomposing pages into Turbo Frames for targeted updates16- Using Turbo Streams for multi-element CRUD updates17- Coordinating Turbo navigation with Stimulus controllers18- Building ViewComponent or Phlex components for complex UI19- Implementing a custom FormBuilder for consistent forms20- Writing view helpers for badges, icons, and conditional classes21- Adding Stimulus controllers for interactive behaviors22- Managing JavaScript dependencies with Import Maps23- Auditing the codebase for UI duplication and naming drift2425## Rule Categories by Priority2627| Priority | Category | Impact | Prefix |28|----------|----------|--------|--------|29| 1 | Design Decisions | CRITICAL | `decide-` |30| 2 | Design Tokens | CRITICAL | `token-` |31| 3 | Turbo Integration | HIGH | `turbo-` |32| 4 | Partial Patterns | HIGH | `partial-` |33| 5 | Component Architecture | HIGH | `comp-` |34| 6 | Form System | MEDIUM-HIGH | `form-` |35| 7 | Helper Patterns | MEDIUM | `helper-` |36| 8 | Stimulus Behaviors | MEDIUM | `stim-` |37| 9 | Consistency & Organization | LOW-MEDIUM | `org-` |3839## Quick Reference4041### 1. Design Decisions (CRITICAL)4243- [`decide-three-uses-rule`](references/decide-three-uses-rule.md) - Extract only after a pattern appears in 3+ places44- [`decide-partial-vs-component`](references/decide-partial-vs-component.md) - Choose partials for simple reuse, components for complex logic45- [`decide-helper-vs-partial`](references/decide-helper-vs-partial.md) - Use helpers for tiny HTML fragments, partials for layout blocks46- [`decide-prove-then-extract`](references/decide-prove-then-extract.md) - Prove patterns in production before abstracting47- [`decide-avoid-wrapper-components`](references/decide-avoid-wrapper-components.md) - Avoid thin wrappers that add indirection without value48- [`decide-design-system-scope`](references/decide-design-system-scope.md) - Scope the design system to what the app actually needs4950### 2. Design Tokens (CRITICAL)5152- [`token-tailwind-theme`](references/token-tailwind-theme.md) - Define tokens with Tailwind CSS @theme directive53- [`token-semantic-color-names`](references/token-semantic-color-names.md) - Name colors by purpose, not appearance54- [`token-spacing-scale`](references/token-spacing-scale.md) - Use a constrained spacing scale for consistent layout55- [`token-typography-scale`](references/token-typography-scale.md) - Define a typography scale for headings, body, and UI text56- [`token-component-tokens`](references/token-component-tokens.md) - Create component-level tokens for repeated patterns57- [`token-share-tokens-with-ruby`](references/token-share-tokens-with-ruby.md) - Share token values between CSS and Ruby when needed5859### 3. Turbo Integration (HIGH)6061- [`turbo-drive-defaults`](references/turbo-drive-defaults.md) - Let Turbo Drive handle navigation by default62- [`turbo-frame-decompose`](references/turbo-frame-decompose.md) - Decompose pages into Turbo Frames for targeted updates63- [`turbo-frame-naming`](references/turbo-frame-naming.md) - Name Turbo Frames with dom_id conventions64- [`turbo-frame-vs-stream`](references/turbo-frame-vs-stream.md) - Choose Turbo Frames vs Turbo Streams by scope of change65- [`turbo-stream-crud`](references/turbo-stream-crud.md) - Use Turbo Streams for multi-element page updates66- [`turbo-stimulus-coordination`](references/turbo-stimulus-coordination.md) - Coordinate Turbo and Stimulus without conflicts6768### 4. Partial Patterns (HIGH)6970- [`partial-explicit-locals`](references/partial-explicit-locals.md) - Always pass locals explicitly to partials71- [`partial-presenter-objects`](references/partial-presenter-objects.md) - Use presenter objects to encapsulate view logic72- [`partial-naming-conventions`](references/partial-naming-conventions.md) - Name partials by what they render, prefixed with underscore73- [`partial-yield-blocks`](references/partial-yield-blocks.md) - Use yield blocks for flexible partial layouts74- [`partial-collection-with-spacer`](references/partial-collection-with-spacer.md) - Use collection rendering with spacer templates75- [`partial-shared-directory`](references/partial-shared-directory.md) - Place cross-controller partials in app/views/shared7677### 5. Component Architecture (HIGH)7879- [`comp-when-to-use`](references/comp-when-to-use.md) - Use components when partials outgrow simple rendering80- [`comp-explicit-args`](references/comp-explicit-args.md) - Define explicit typed arguments for every component81- [`comp-slots-for-markup`](references/comp-slots-for-markup.md) - Use slots for caller-provided markup blocks82- [`comp-test-rendered-output`](references/comp-test-rendered-output.md) - Test components by asserting on rendered HTML8384### 6. Form System (MEDIUM-HIGH)8586- [`form-custom-builder`](references/form-custom-builder.md) - Create a custom FormBuilder for consistent form rendering87- [`form-set-default-builder`](references/form-set-default-builder.md) - Set the custom builder as the application default88- [`form-error-display`](references/form-error-display.md) - Display field errors inline with consistent markup89- [`form-accessible-labels`](references/form-accessible-labels.md) - Generate accessible labels and ARIA attributes automatically90- [`form-group-wrapper`](references/form-group-wrapper.md) - Wrap label + input + error in a consistent group element91- [`form-button-consistency`](references/form-button-consistency.md) - Standardize submit buttons through the form builder9293### 7. Helper Patterns (MEDIUM)9495- [`helper-tag-helpers`](references/helper-tag-helpers.md) - Use tag helpers for small generated HTML fragments96- [`helper-conditional-classes`](references/helper-conditional-classes.md) - Use class_names for conditional CSS classes97- [`helper-icon-helper`](references/helper-icon-helper.md) - Create an icon helper for consistent icon rendering98- [`helper-badge-pattern`](references/helper-badge-pattern.md) - Build a badge helper for status indicators99- [`helper-scope-to-domain`](references/helper-scope-to-domain.md) - Scope helpers to specific domains, not generic utilities100101### 8. Stimulus Behaviors (MEDIUM)102103- [`stim-general-purpose`](references/stim-general-purpose.md) - Write general-purpose controllers, not one-off scripts104- [`stim-data-attribute-config`](references/stim-data-attribute-config.md) - Configure behavior through data attributes, not JavaScript105- [`stim-small-controllers`](references/stim-small-controllers.md) - Keep controllers small and single-responsibility106- [`stim-composable-controllers`](references/stim-composable-controllers.md) - Compose multiple controllers on one element107- [`stim-use-outlets`](references/stim-use-outlets.md) - Use outlets for cross-controller communication108- [`stim-leverage-library`](references/stim-leverage-library.md) - Use stimulus-components before writing custom controllers109110### 9. Consistency & Organization (LOW-MEDIUM)111112- [`org-naming-conventions`](references/org-naming-conventions.md) - Follow consistent naming across partials, components, and helpers113- [`org-file-structure`](references/org-file-structure.md) - Organize design system files in predictable locations114- [`org-deduplication-audit`](references/org-deduplication-audit.md) - Periodically audit views for duplicated patterns115- [`org-import-maps`](references/org-import-maps.md) - Use Import Maps for zero-build JavaScript delivery116- [`org-preview-with-lookbook`](references/org-preview-with-lookbook.md) - Preview components with Lookbook in development117- [`org-document-design-decisions`](references/org-document-design-decisions.md) - Document design system decisions in ADRs118119## How to Use120121Read individual reference files for detailed explanations and code examples:122123- [Section definitions](references/_sections.md) - Category structure and impact levels124- [Rule template](assets/templates/_template.md) - Template for adding new rules125126## Reference Files127128| File | Description |129|------|-------------|130| [references/_sections.md](references/_sections.md) | Category definitions and ordering |131| [assets/templates/_template.md](assets/templates/_template.md) | Template for new rules |132| [metadata.json](metadata.json) | Version and reference information |