Rails_ai_agents active-storage-setup
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/active-storage-setup" ~/.claude/skills/thibautbaissac-rails-ai-agents-active-storage-setup && rm -rf "$T"
manifest:
.claude/skills/active-storage-setup/SKILL.mdsource content
Active Storage Setup for Rails 8
Overview
Active Storage handles file uploads in Rails:
- Cloud storage (S3, GCS, Azure) or local disk
- Image variants (thumbnails, resizing)
- Direct uploads from browser
- Polymorphic attachments
Quick Start
# Install Active Storage (if not already) bin/rails active_storage:install bin/rails db:migrate # Add image processing bundle add image_processing
Configuration
Storage Services
# config/storage.yml local: service: Disk root: <%= Rails.root.join("storage") %> test: service: Disk root: <%= Rails.root.join("tmp/storage") %> amazon: service: S3 access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> region: eu-west-1 bucket: <%= Rails.application.credentials.dig(:aws, :bucket) %> google: service: GCS credentials: <%= Rails.root.join("config/gcs-credentials.json") %> project: my-project bucket: my-bucket
Environment Config
# config/environments/development.rb config.active_storage.service = :local # config/environments/production.rb config.active_storage.service = :amazon
Model Attachments
Single Attachment
# app/models/user.rb class User < ApplicationRecord has_one_attached :avatar # With variant defaults has_one_attached :avatar do |attachable| attachable.variant :thumb, resize_to_limit: [100, 100] attachable.variant :medium, resize_to_limit: [300, 300] end end
Multiple Attachments
# app/models/event.rb class Event < ApplicationRecord has_many_attached :photos has_many_attached :documents do |attachable| attachable.variant :preview, resize_to_limit: [200, 200] end end
TDD Workflow
Active Storage Progress: - [ ] Step 1: Add attachment to model - [ ] Step 2: Write model spec for attachment - [ ] Step 3: Add validations (type, size) - [ ] Step 4: Create upload form - [ ] Step 5: Handle in controller - [ ] Step 6: Display in views - [ ] Step 7: Test upload flow
Testing Attachments
See testing.md for model specs, factory traits, and request specs.
Key patterns:
- Use
in request specsfixture_file_upload - Define
factory traits using:with_avatarafter(:build) - Test
and variant presence in model specsbe_attached
Validations
Use the
active_storage_validations gem for declarative validation, or write manual validate methods. See validations.md for both approaches.
# Gemfile gem 'active_storage_validations'
Image Variants
Define named variants on the model attachment using
resize_to_fill, resize_to_limit, or resize_to_cover. See variants-and-views.md for variant operations, view helpers, and form examples.
Controller and Service Handling
- Permit
for single uploads,:avatar
for multiplephotos: [] - Use
to remove attachments, with optional Turbo Stream responsepurge - Use
orrails_blob_path
for downloadssend_data
See controller-and-service.md for full controller examples, service methods, direct uploads setup, and performance tips.
Checklist
- Active Storage installed and migrated
- Storage service configured
- Image processing gem added (if using variants)
- Attachment added to model
- Validations added (type, size)
- Variants defined
- Controller permits attachment params
- Form handles file upload
- Tests written for attachments
- Direct uploads configured (if needed)
References
- testing.md - Model specs, factory traits, request specs
- validations.md - Gem-based and manual validation examples
- variants-and-views.md - Variant definitions, view helpers, upload forms
- controller-and-service.md - Controllers, service methods, direct uploads, performance