Active Storage とは…?
Active Storage とは、Ruby on Rails Ver.5.2 から実装されたファイルのアップロードをするための機能です。
Active Storage を使用することで、ローカルストレージへのファイルの保存はもちろん、Amazon S3,Google Cloud Storage,Microsoft Azure Storage といったクラウドストレージへのファイルのアップロードも簡単にすることができます。
これまでは、Carrierwave 等の Gem を利用してしていましたが、これからは Gem を使わずに Ruby on Rails の1つの機能としてファイルアップロード機能ができちゃうんです!
Active Storage をアプリケーションにインストールする。
- Active Storage をアプリケーションで使えるようにインストールするために以下のコマンドを入力します。
$ rails active_storage:install
- Active Storage が使用するテーブルをマイグレーションして作成します。
$ rails db:migrate
- このコマンドによって、
active_storage_blobs
とactive_storage_attachments
というテーブルが作成されます。
active_storage_blobs
がアップロードしたファイルの情報を記録しているテーブル。active_storage_attachments
はアプリケーションの該当するモデルとactive_storage_blobs
を繋ぐ中間テーブルです。
ファイルをアップロードするモデルを作成する。
- ファイルをアップロードするモデルを作成します。
$rails g model モデル名
- モデルと Active Storage が使用するテーブルとをアソシエーション(関連付け)します。
class モデル名 < ApplicationRecord
has_one_attached :image
# アップロードするファイルが 1枚のときは `has_one_attached` とします。
# `:image` はビューファイルにてフォームヘルパーで指定するカラム名に応じて適宜 変更して下さい。
has_many_attached :images
# アップロードするファイルが 複数枚のときは `has_many_attached` とします。
# `:images` はビューファイルにてフォームヘルパーで指定するカラム名に応じて適宜 変更して下さい。
end
- フォームから送信されたパラメータをストロングパラメータでテーブルへの保存を許可します。
class ● ● ● Controller < ApplicationController
private
def ○ ○ ○
params.require(:モデル名).permit(:カラム名, :image)
# アップロードするファイルが 1枚のときの記述です。
params.require(:モデル名).permit(:カラム名, :images: [])
# アップロードするファイルが複数枚のときはカラム名を空の配列にしておきます。
end
end
【重要】 上述の説明で :image
,:images
としているカラム名ですが、アプリケーションのモデルには :image
,:images
といったカラムは作成しません。
ビューファイルのフォームから <%= form.file_field :image %>
等でファイルを送信してあげると自動的に active_storage_blobs
に保存されて、active_storage_attachments
により該当するモデルと関連付けられます。
これが Active Storage の便利なところであり、ちょっと厄介なところですね。
Active Storage を使用してアップロードしたファイルの保存先を設定する。
-
config/environments/
ディレクトリにあるproduction.rb (本番環境用)
development.rb (開発環境用)
test.rb (テスト環境用)
の各ファイル内のconfig.active_storage.service
の設定を変更します。
config.active_storage.service = : ○ ○ ○
# 設定したい保存先に合わせて `:local (ローカル環境)` `:amazon (Amazon S3)` `:google (Google Cloud Storage)` `:microsoft (Microsoft Azure Storage)` と記述します。