BackEnd

Active Strageを使用してユーザーのアバターを登録、表示する

投稿日:2018年3月12日 更新日:

はじめに

Ruby on Rails の 5.2 リリースが近づいてきました。
(この記事執筆時点では 5.2.0.rc1 がリリースされています。)

今回は、Rails 5.2 の目玉の1つである Active Strage を使ってみようと思います。
Active Strage は、ファイルのアップロード機能であり、今まで CarrierWave だったり Shrine を使っていたところです。
Rails の標準機能として実装されるのは嬉しいです。
Active Storage の概要 | Rails ガイド

今回はガイドページにあるように、ユーザーにアバター画像を紐付けるケースを想定して実施していこうと思います。

環境

  • Ruby 2.5.0
  • Rails 5.2.0.rc1

セットアップ

前準備

今回はユーザー1レコードにつき、1つのアバター画像をアタッチします。
そのため、あらかじめユーザーのCRUDを作成しておきます。
今回は分かりやすいよう、 users テーブルには最低限のカラムしか持たせていません。
(後述しますが、Active Strage用にカラムは必要ないようです。)

マイグレーションファイル作成

Active Strageでは、以下の2つのテーブルを使用してファイルをアタッチします。

  • active_strage_blobs
  • active_strage_attachments

そのため、まずはこのテーブルを作成するマイグレーションファイルを作成します。
幸いなことにコマンドで生成できます。

テーブルのスキーマを見ると、このような感じです。

blobs の方が、アタッチしたファイル自体を管理しています。
attachments の方で、どのレコードと blobs が紐づいているか管理しています。

設定ファイル

Rails 5.2 では、Active Strage用のYAMLファイルができていました。
こちらでパスなどを設定します。

なお、AWS S3やMicrosoft Azureなども指定できます。
ここで宣言したキーを使って( testlocal など)、各環境での設定ファイルにて指定します。

実際に使って見る

モデル

まずは、 User モデルに、アバター画像をアタッチするアクセサを定義します。

このアクセサに、Active Strageがファイルをアタッチしてくれます。
なお、レコードとファイルが1対1の場合は has_one_attached ですが、1対多の場合は has_many_attached になります。
(1対多の関係については後日記事にできたらいいな。)

コントローラー

create する場合は、ストロングパラメータに含めてしまえば、User のレコードを作成しつつ、 blobsattachments にレコードを作成します。

更新の場合は、 avatar.attach を使うようです。
私は下記のように書いてみました。
(もうちょっと良い書き方ありそう。。。)

画像は、 storage ディレクトリに暗号化された状態で格納されます。

また、対象の画像の active_storage_blobsactive_storage_attachments は下記のようになっています。

また、保存時には ActiveJob をはじめ複数のジョブが動きます。

ビュー

@user.avatar.attached? でアタッチ済みか判定されます。
アタッチされた画像は image_tag を使用して下記のように表示できるようです。

また、mini-magickをインストールすれば、 variant でリサイズを作成することもできます。

個人的メモ

RoutingErrorのハンドリング

routes.rb でRoutingErrorのハンドリングをしていると、Active Storage経由の画像が表示されないかも。
こちらのQiita記事にて解説がされておりますので注意です。
active storageの画像がリンク切れする – Qiita

ImageMagickを忘れずにインストール

ImageMagick自体をインストールしないと、S3にアップしたファイルのリサイズに失敗します。
mini_magickaws-sdk-s3 をインストールして満足しないようにしよう。

さいごに

AWSのS3も試してみましたが、コンフィグの書き換えだけで作動しました。
簡単に画像アップロードが用意できるため、今後使われていくのではないでしょうか?

page_footer_300rect




page_footer_300rect




-BackEnd
-

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

js

GoogleAppsScriptを使ってmBaaSの定期実行処理を実装する

1 はじめに1.1 簡単な状況説明1.2 定期実行を行う方法2 実装2.1 実装の流れ2.2 JavaScriptの実装2.3 スクリプトをアップロードする2.4 Google Apps Script ...

rails

さらば「rails migrate」、よろしく「ridgepole」

1 はじめに2 Ridgepoleとは3 rails migrateではなく、Ridgepoleを選定した理由4 rails migrateからRidgepoleへの移行手順5 capistrano3 ...

rails

deviseを使ってユーザ登録フォームを作る

1 はじめに1.1 前提条件2 deviseについて2.1 deviseとは2.2 deviseでできること3 登録処理の実装3.1 Gemのインストール3.2 deviseのインストール3.3 デフ ...

Rubyを使ってDialogflowのお勉強

1 はじめに1.1 環境2 とりあえずAPIで叩いてみる2.1 テスト用のIntentを作成2.2 Gemの設定3 Eventについて3.1 WELCOMEイベント3.2 パラメータ付きで叩く3.3 ...

rails

Rails Developer Meetup に参加してきました【2日目】

1 はじめに2 Rails Developer Meetup3 テストのないレガシーなRailsアプリをリファクタした話3.1 なぜリファクタリングしたのか3.2 コードを3種類に分類する3.3 モデ ...

フォロー

follow us in feedly

AppLink

page_side_300rect

2018年3月
« 2月 4月 »
 123
45678910
11121314151617
18192021222324
25262728293031

アプリ情報

目標を達成したい方を応援する、TODOアプリもリリースしております。 下記のアイコンから無料でダウンロードできます。

Web版MyCoach

私たちはより広い方にコーチングを知ってもらいたいと考えています。 下記のサイトにて、コーチの方々を紹介しておりますので、よろしければご覧ください。