【Rails】Active Storageの使い方

Rails5.2で追加されたファイルアップロード機能 Active Storage を使ってみたのでまとめます。

Active Storage を使えばローカルではローカル内のディレクトリを使用し、本番ではAWSのS3等を使用するといった運用もできます。

Setup

Active Storageでは「active_storage_blobs」と「active_storage_attachments」というテーブルを使用します。用途はあとで説明しますが、とりあえずテーブル作成のため以下コマンドを実行します。

設定

次は環境に関する設定です。

まずはローカル環境の保存場所の設定ですが、デフォルトで以下の通りとなっていると思います。これはstorageディレクトリ配下にアップロードしたファイルを保存する設定で特別なことがなければこのままで大丈夫です。

storage.yml

次に本番環境設定です。
例としてS3を使用する場合は以下の通りです。おそらくデフォルトでコメントアウトされているのでそれを外してあげましょう。
各パラメータは使用するS3に合わせて変更します。

storage.yml

これらの設定を使用するために各環境ファイルの設定を変更します。

まずはローカル環境

config/environments/development.rb

次に本番環境

config/environments/production.rb

今回の例では本番環境でS3を使用するためドライバをインストールするためgemに以下を追加します。

Gemfile

追加した後はbundle installするのを忘れないようにしましょう。

ここまでで設定は完了です!

ファイルアップロード機能

Active StorageではDBのレコードにファイルを関連づけます。
ここでは想定として演奏者情報をもつplayersテーブルのレコードは演奏者の画像を持っていることとします。

まずはモデルにファイルとの関連を表す定義を記述します。

player.rb

これで画像ファイルをモデルのavatarという変数で扱うことができます。avatarは別の名称でも大丈夫です。

次にファイルアップロードの処理をコントローラとビューに記述します。

player_controller.rb

show.html.erb

こんな感じでテーブルの一つのカラムのように扱うことができます。

ただし実際にはplayersテーブルにはファイルに関連する情報は格納されていません。
ファイルの情報が格納されているのは一番最初のセットアップで作成した「active_storage_blobs」と「active_storage_attachments」というテーブルです。これらのテーブルがファイルとの関連付けをすることで実装者としては一つのカラムのように扱うことができます。

ちなみに「active_storage_blobs」と「active_storage_attachments」は実装者が意識する必要はなく、仕組みだけ理解していれば良いでしょう。

ファイルの読み込み

読み込みもテーブルのカラムを扱うように以下の通り簡単にできます。

show.html.erb

最後に

詳細はRailsのガイドに記載がありますのでこちらをご覧ください。
参考 Active Storage の概要RAILS GUIDES