Railsで画像ファイルをアップロードするにはActive Storage

f:id:endoakak:20200725103727j:plain

Active Storageとは

railsにおいて、画像などのファイルのアップロード機能を実装するためのgemです。

画像のサイズなどを加工してからアップロードするためには、ImageMagickというツールと、image_processing、mini_magickというgemも必要になります。

Active Storageのインストール

Active Storageに合わせて、必要なものをインストールしていきます。

まずはterminalで以下のコマンドを実行し、brewからImageMagickをインストールします。

% brew install imagemagick  #ImageMagickのインストール

gemfileに必要なgemを追加します。

gem 'mini_magick'
gem 'image_processing

terminalでインストールします。
gemをインストールした後は、いったんサーバーを再起動する必要があります。

% bundle install

#サーバーを起動していたら、control + cでいったんサーバーを閉じる
% rails s

続いてActive Storageをインストールします。マイグレーションファイルが作成されるので、マイグレートまで行います。

% rails active_storage:install
% rails db:migrate

次の三つのテーブルが生成されたら成功です。

  • active_storage_attachments
  • active_storage_blobs
  • ar_internal_metadata

モデルとの紐付け

次に、画像を既存のテーブルに紐づけるための記述を行います。紐づける相手のモデルで、has_one_attachedメソッドを使います。

Tweetモデルと紐づける場合、次のようにTweetモデルに記述します。

class Tweet < ApplicationRecord
  has_one_attached :image
end

これで紐付けができました。ちなみに、一つのツイートに対して複数の画像を紐づける場合は、has_many_attachedメソッドを使用します。

また、tweets controllerで、imageカラムを受け取れるようにする必要があります。

def tweet_parameter
  params.require(:tweet).permit(:text, :image)
end

active_storage_attachmentsとactive_storage_blobs

active_storage_blobsには、アップロードするファイルの情報が保存されます。

active_storage_attachmentsは、blobsのテーブルと、紐付け先のテーブル(今回で言えばtweetsテーブル)とをつなぐ中間テーブルの役割です。

まとめ

  • active storageを使うと画像ファイルのアップロードができる
  • active storageを使うにはいくつかのgemが必要
  • has_one_attachedメソッドで、画像ファイルと別のテーブルを紐づける