Railsで画像ファイルをアップロードするにはActive Storage
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メソッドで、画像ファイルと別のテーブルを紐づける