- name
- active-storage-setup
- description
- Configures Active Storage for file uploads with variants and direct uploads. Use when adding file uploads, image attachments, document storage, generating thumbnails, or when user mentions Active Storage, file upload, attachments, or image processing. WHEN NOT: Storing data in database columns, external URL references, static assets in the asset pipeline, or simple text/JSON storage.
- paths
- app/models/**/*.rb, app/controllers/**/*.rb, config/storage.yml
# 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
```bash
# 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
```yaml
# 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
```ruby
# config/environments/development.rb
config.active_storage.service = :local
# config/environments/production.rb
config.active_storage.service = :amazon
```
## Model Attachments
### Single Attachment
```ruby
# 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
```ruby
# 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](references/testing.md) for model specs, factory traits, and request specs.
Key patterns:
- Use `fixture_file_upload` in request specs
- Define `:with_avatar` factory traits using `after(:build)`
- Test `be_attached` and variant presence in model specs
## Validations
Use the `active_storage_validations` gem for declarative validation, or write manual `validate` methods. See [validations.md](references/validations.md) for both approaches.
```ruby
# 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](references/variants-and-views.md) for variant operations, view helpers, and form examples.
## Controller and Service Handling
- Permit `:avatar` for single uploads, `photos: []` for multiple
- Use `purge` to remove attachments, with optional Turbo Stream response
- Use `rails_blob_path` or `send_data` for downloads
See [controller-and-service.md](references/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](references/testing.md) - Model specs, factory traits, request specs
- [validations.md](references/validations.md) - Gem-based and manual validation examples
- [variants-and-views.md](references/variants-and-views.md) - Variant definitions, view helpers, upload forms
- [controller-and-service.md](references/controller-and-service.md) - Controllers, service methods, direct uploads, performance
View on GitHub