ActiveStorageの導入

ActiveStorageについて

Amazon S3Google Cloud Storage、Microsoft Azure Storageなどのクラウドストレージサービスへのファイルのアップロードや、ファイルをActive Recordオブジェクトにアタッチする機能を提供します。Active Storageは、アプリケーションにアップロードした画像の変形や、PDFや動画などの画像以外のアップロードファイルの内容を代表する画像の生成、任意のファイルからのメタデータ抽出にも利用できます。 簡単にいうと、Railsで画像の投稿や表示を行うためのものです。

参考URL

Active Storage の概要 - Railsガイド

Active Storageのインストール

下記のコマンドを実行し、インストールを実行します。

$ rails active_storage:install

実行すると下記のようなマイグレーションファイルが作成される。

下記コマンドを実行し、migrateする。

$ rails db:migrate

画像表示するモデルに記述

ActiveStorageを使って画像を表示する際には、どのモデルに対して画像を使うのかを宣言する必要があります。

今回は、Userモデルに画像をつけたいので、app/models/user.rbに下記の記載をする。

class User < ApplicationRecord
  has_one_attached :profile_image
end

上記の記述をすることで、Userモデルにprofileカラムが追加されたように扱うことができるようになる。

Railsで画像サイズを変更する

このアプリケーションでは、「image_processing」というGemを用いて画像サイズの変更を行います。

既にGemfileにはコメントアウトされた状態で「image_processing」が記述されているため、コメントアウトを解除します。 下記のように修正します。

Gemfile

(変更前)# gem 'image_processing', '~>1.2'

(変更後)gem 'image_processing', '~>1.2'

変更後、bundle installの実行。

また、後に記述するコードのエラー回避のため、下記をconfig/environments/development.rbに記述します。

config/environments/development.rb

config.active_job.queue_adapter = :inline

画像が存在しない場合に表示する画像の設定

今回作成するアプリケーションでは、前述のようにUserに画像を設定する。

しかし、新規登録時には画像が設定されないため、画像が設定されていない場合はapp/assets/imagesに格納されている

default_image.jpgという画像をデフォルト画像としてActiveStorageに格納し、格納した画像を表示するという設定を記述する。

models/user.rb

  def get_profile_image(width, height)
    unless profile_image.attached?
      file_path = Rails.root.join('app/assets/images/default_image.jpg')
      profile_image.attach(io: File.open(file_path), filename: 'default-image.jpg', content_type: 'image/jpeg')
    end
    profile_image.variant(resize_to_limit: [width, height]).processed
  end

上記記述により、画像が設定されていない場合、app/assets/imagesに格納されているdefault_image.jpgが表示される。

また、画像サイズの変更もwidthとheightの引数を渡すことで、容易に指定できるようにしている。

以上。

アプリケーションの作成 参考URL  作成するアプリケーションについて - takifugu’s blog