(Ruby on Rails)Active Strageを使って画像ファイルを添付する方法
はじめに
Webアプリケーションを作成する中で、ユーザーにトップ画像を保存、活用したい場面が発生しました。実装方法を検索する中で、Rails5.2から「Active Storage」というファイル管理のgemがあるので、今回はこちらを使って画像ファイルを扱ってみたいと思います。(今回はローカル環境での実装です)
Active Storageの準備
ターミナル上で以下のコマンドを実行し、アプリケーションでActive Storageを使う為の準備をします。
$ bin/rails active_storage:install
すると、マイグレーションファイルが作成されます。このマイグレーションファイルは、Active Storageが利用する(active_storage_blobs)、(active_storage_attachments)の2つのテーブルを作成します。前者は、添付されたファイルに対応するモデル、後者は、中間モデルにあたります。
DBに反映する為に以下のコマンドを実行します。
$ bin/rails db:migrate
Userモデル編集と実装
has_one_attachedメソッドを使いユーザー1人に1つの画像を紐付けます。
-app/models/user.rb- class User < ApplicationRecord has_one_attached :avatar ... end
続いてビューにフォームを作成していきます。
... <%= f.label :avatar, 'アイコン:', class: 'form-label' %> (今回はラベルにアイコンと表示させます) <%= f.file_field :avatar, class: 'form-control' %> ...
すると、画面に画像フィードが表示されます。
ストロングパラメータの変更
このままでは画像を登録する事が出来ないので、許可するパラメーターのキーに:avatarを追加する必要があります。
def user_create_params params.require(:user).permit(:name, :avatar, ...) end
これ画像を登録できるようになりました!! あとはビュー側でimage_tagで表示させれば完成です。
<%= image_tag @user.avatar if @user.avatar.attached? %>
今回は、attachdメソッドという判定メソッドを利用して、画像がある場合のみ表示させるようにしています。
使ってみて非常に簡単に画像を扱える印象です。CarrierWaveというgimがよく使われているようなので、一度利用してみたいとも思いますが、Rails5.2以降の場合は、Active Strageの方が簡単に利用できるとは思います。