0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

画像のアップロード機能 Active Storage 導入の仕方

0
Last updated at Posted at 2021-05-29

はじめに

アプリケーション作成にあたって、ファイルのアップロード機能の実装は、割と導入することが多いんじゃないかなーと思っています。

整理してまとめておこうと思います!

Active Storage

RailsではActive StorageというGemで画像などのファイルのアップロードを簡単にするメソッドが使用できたり、画像を保存するテーブルを簡単に作成できます。

現在Railsに統合されているのでいちいちGemfileに記述をする必要はないそうです。
※その他に必要なGemがあるのでそちらは記述してインストールする必要があります

画像加工ツール

Active Storageでファイルをアップロードして保存しても、サイズや色などを加工することはできません。

そこで画像を加工できるように、画像変換ツールやGemをインストールします。

・ ImageMagick

まずはImageMagick。
これはGemではなくソフトウェアです。なので一回インストールしちゃえば、それ以降は基本的にいちいちコマンド実行する必要ないと思います!

コマンドラインから画像に処理を加えることができ、画像の作成やサイズ変更、保存形式の変更などができます。

Homebrewからインストールします。

ターミナル
% brew install imagemagick

・ MiniMagick

こちらはGemです。
先ほどのImageMagickをRubyで扱えるようにしてくれます。

・ ImageProcessing

こちらもGemです。

MiniMagickによってImageMagickがRubyが使えるようになったのですが、サイズ調整はできないみたいです。
そこでこのImageProcessingがサイズ調整を担当してくださるそうです。

なんだか、ややこしいですね。。。
魔法を使うにも下準備はたくさんしてあげないとってことなんでしょうか 笑
魔法陣を描いてると思って導入しちゃってください!

Gemfile
# Gemfileの一番下に記述する

gem 'mini_magick'
gem 'image_processing', '~> 1.2'

からの

ターミナル
% bundle install

画像加工ツールはこれでOKです

Active Storage インストール

ターミナルで下記のコマンド入力で完了です

ターミナル
% rails active_storage:install

% rails db:migrate

データベースを確認して
[active_storage_attachments]と[active_storage_blobs]
というテーブルが作成されていれば、導入成功です。

どうやって保存するのか

おそらく画像をアップロードして保存する時は他の情報も一緒に保存することが多いと思います。
例えばメッセージと一緒に画像を添付して保存とか

でも、メッセージのテーブルとは別にActive Storageのテーブルが用意されています。なのでその二つのテーブルのアソシエーションを組んであげて関連づけてあげれば問題なしです!
※メッセージのテーブルに:imageとかのカラムを作成する必要はありません!!

上記の例でmessagesというテーブルにレコードが保存される時、画像を添付して保存する方法を説明します。

アソシエーションを定義

Active Storageのテーブルと messagesテーブルのアソシエーションを組みます。

そのためにhas_one_attachedメソッドを使います

has_one_attachedは各レコードとファイルを1対1の関係で紐づけるメソッドです。
has_one_attachedメソッドを記述したモデルの各レコードは、それぞれ1つのファイルを添付できます。

今回の場合messageモデルに下記のように記述します

app/models/messages.rb
class Message < ApplicationRecord
  has_one_attached :image
end

これでアソシエーションは組めました。
あとはmessageのストロングパラメーターに:imageも許可してあげたら、メッセージ送信時に添付されているファイルはActive Storageのテーブルへ保存されるはずです。

おまけ

最後に、Active Storage関連で重要そうだから名前とざっくりとした役割だけ書いといて、詳しい使い方は調べたり別の回でまとめようと思っているものたちを適当に書いておきます。

image_tagメソッド

画像関連のimg要素を生成するヘルパーメソッド
ビューですごくご活躍されているイメージ

attached?メソッド

ファイルが添付されてたらtrue
されてなかったらfalseを返してくれる
オブションでifと一緒に使ってあげると便利そう

variantメソッド

ファイルの表示サイズが指定できる
'幅 x 高さ'みたいな感じで大きさ調整するみたいなんですが、[ x ]はエックスらしいので、なんだか、それは覚えておこうと思った

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?