Rails 5.2 で登場した Active Storage は、2025 年時点では Rails 標準のファイルアップロード手段として完全に定着した。
昔の paperclip や carrierwave を使っていた頃とは概念が大きく異なる。
ここでは現代の Rails(7〜8)における Active Storage の基本・差分・使いどころをまとめる。
昔の paperclip/carrierwave との大きな差分:
| 項目 | 昔(paperclip 等) | Active Storage |
|---|---|---|
| 保存場所 | モデルにカラム追加 | 別テーブルで一元管理 |
| 画像処理 | gem 依存 mini_magick 等 | image_processing 経由で標準 |
| 複数添付 | 独自実装が多い | has_many_attached が標準 |
| リッチテキスト | 別ライブラリ | Action Text と統合 |
| S3 | 追加設定多数 | YAML1 ファイルで完結 |
bin/rails active_storage:install
bin/rails db:migrate
Active Storage の 2 テーブル(active_storage_blobs / active_storage_attachments)が作成される。
S3 を使う例:
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: ap-northeast-1
bucket: my-app-bucket
config/environments/production.rb
config.active_storage.service = :amazon
class User < ApplicationRecord
has_one_attached :avatar
end
class Post < ApplicationRecord
has_many_attached :images
end
<%= form_with(model: @user, local: true) do |f| %>
<%= f.file_field :avatar %>
<%= f.submit "アップロード" %>
<% end %>
※ Turbo でアップロードがうまくいかない場合は:
<form data-turbo="false">
を付けて無効化するケースもある。
<%= image_tag @user.avatar %>
サムネイル(variant):
<%= image_tag @user.avatar.variant(resize_to_limit: [300, 300]) %>
<%= link_to "Download", rails_blob_path(@user.avatar, disposition: "attachment") %>
Rails 7 以降では次の gem を使う:
gem "image_processing", "~> 1.2"
Active Storage の画像バリアントはこれ経由。
Action Text を使う場合、画像は自動で Active Storage に保存される:
class Article < ApplicationRecord
has_rich_text :content
end
Trix エディタ内で貼り付けた画像は、そのまま Active Storage に保存され、
サムネイルや埋め込みも Rails がすべて管理してくれる。
Active Storage では、ブラウザから S3 等に直接アップロードできる Direct Upload が標準で利用可能。
フォームに以下を追加するだけ:
<%= f.file_field :avatar, direct_upload: true %>
※ S3 に直アップロードされるため、アプリ側の負荷が大幅に減る。
Direct Upload を使わないと、Rails が一度受け取るため重くなる。
ローカル:/rails/active_storage/blobs/...
本番(S3):署名付き URL
purge と purge_later の使い分けに注意。
@user.avatar.purge
@user.avatar.purge_later
file = fixture_file_upload("spec/fixtures/avatar.png", "image/png")
user.avatar.attach(file)
attach_file "Avatar", "spec/fixtures/avatar.png"
昔のアップローダー gem よりはるかに扱いやすく、Rails らしい統合的な設計になっている。