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