バーテンダーエンジニア

元フレアバーテンダーからエンジニアに転職。未経験からのエンジニア転職経験談・実務で感じたこと・個人開発で学んだ内容・日常話などマイペースに発信していきます。仕事ではphp、Laravel、Vue.js、Angular辺りを触ってます。趣味は筋トレ!!ソムリエの資格も持ってます^^

(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の方が簡単に利用できるとは思います。