アットウィキロゴ

ActiveStorage

Active Storage(2025 年版)

Rails 5.2 で登場した Active Storage は、2025 年時点では Rails 標準のファイルアップロード手段として完全に定着した。
昔の paperclipcarrierwave を使っていた頃とは概念が大きく異なる。

ここでは現代の Rails(7〜8)における Active Storage の基本・差分・使いどころをまとめる。


■ Active Storage の特徴(昔との違い)

  • Rails に完全統合(追加 Gem 不要)
  • モデルに「ファイルカラム」を持たず、別テーブルで管理
  • S3、GCS、Azure など複数ストレージに統合対応
  • variant(サムネイル)や preview(PDF/動画プレビュー)も標準
  • Action Text(Trix)と完全連携

昔の paperclip/carrierwave との大きな差分:

項目 昔(paperclip 等) Active Storage
保存場所 モデルにカラム追加 別テーブルで一元管理
画像処理 gem 依存 mini_magick 等 image_processing 経由で標準
複数添付 独自実装が多い has_many_attached が標準
リッチテキスト 別ライブラリ Action Text と統合
S3 追加設定多数 YAML1 ファイルで完結

■ セットアップ

● 1. インストール(Rails 標準コマンド)

bin/rails active_storage:install
bin/rails db:migrate

Active Storage の 2 テーブル(active_storage_blobs / active_storage_attachments)が作成される。


■ ストレージ設定

● config/storage.yml

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

■ モデルへの添付(フォームの書き方は昔と別物)

● 1つのファイルを添付(has_one_attached)

class User < ApplicationRecord
  has_one_attached :avatar
end

● 複数ファイル(has_many_attached)

class Post < ApplicationRecord
  has_many_attached :images
end

■ フォームでの入力(Turbo 対応)

● Rails の form_with

<%= form_with(model: @user, local: true) do |f| %>
  <%= f.file_field :avatar %>
  <%= f.submit "アップロード" %>
<% end %>

※ Turbo でアップロードがうまくいかない場合は:

<form data-turbo="false">

を付けて無効化するケースもある。


■ 表示(URL生成・画像表示)

<%= 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") %>

■ 画像処理(image_processing gem)

Rails 7 以降では次の gem を使う:

gem "image_processing", "~> 1.2"

Active Storage の画像バリアントはこれ経由。


■ Active Storage + Action Text(Trix)

Action Text を使う場合、画像は自動で Active Storage に保存される:

class Article < ApplicationRecord
  has_rich_text :content
end

Trix エディタ内で貼り付けた画像は、そのまま Active Storage に保存され、
サムネイルや埋め込みも Rails がすべて管理してくれる。


■ Direct Upload(JS なしの昔方式との違い)

Active Storage では、ブラウザから S3 等に直接アップロードできる Direct Upload が標準で利用可能。

フォームに以下を追加するだけ:

<%= f.file_field :avatar, direct_upload: true %>

※ S3 に直アップロードされるため、アプリ側の負荷が大幅に減る。


■ Active Storage の落とし穴・注意点(2025)

● 1. 巨大ファイルはアプリ側に負担

Direct Upload を使わないと、Rails が一度受け取るため重くなる。

● 2. ローカルと本番で URL が異なる

ローカル:/rails/active_storage/blobs/...
本番(S3):署名付き URL

● 3. 削除時には関連 Blob が残るケース

purgepurge_later の使い分けに注意。


■ 削除(purge / purge_later)

● 即時削除

@user.avatar.purge

● ActiveJob による非同期削除

@user.avatar.purge_later

■ テスト(RSpec)

● fixture_file_upload

file = fixture_file_upload("spec/fixtures/avatar.png", "image/png")
user.avatar.attach(file)

● System Test(attach_file)

attach_file "Avatar", "spec/fixtures/avatar.png"

■ まとめ

  • Active Storage は Rails 標準のアップロード機能
  • モデルにファイルカラムを持たず「添付(attach)」で扱う
  • S3 などの外部ストレージを Rails が一括管理
  • variant(サムネイル)、direct upload(直アップロード)も標準
  • Action Text と完全統合
  • Turbo と併用する場合は data-turbo="false" の考慮が必要

昔のアップローダー gem よりはるかに扱いやすく、Rails らしい統合的な設計になっている。

最終更新:2025年12月09日 09:32