#はじめに
ActiveStorageを使った画像保存から表示までの説明。前回の投稿で、ActiveStorageの導入方法については説明している。
リンク↓
ActiveStorageを使って、画像投稿機能実装までの流れ
#画像の保存から表示までの流れ
- アソシエーションの定義
- ストロングパラメーターに画像保存の許可をする
- HTMLのimg要素として生成
- エラーの解消
- 画像の大きさ調整
- バリデーションの設定
###1. アソシエーションの定義
has_one_attachedメソッド
を用いて、各レコードと画像ファイルを1対1の関係で紐づける。
紐づけたいモデルファイルに記述
class モデル < ApplicationRecord
has_one_attached :ファイル名
end
ファイル名には、呼び出す際の名前を設定する。また、パラメーターのキーになる。
ex):image, :file etc
イメージとしては、ファイル名のカラムができて、そこに添付ファイルが入っているような感じ。
このアソシエーションをすることで、
モデル名.ファイル名
で添付したファイルにアクセスすることができる。
###2. ストロングパラメーターに画像保存の許可をする
params.require(:message).permit(:text, :image)
アソシエーションの定義のときにも取り上げたように、パラメーターのキーにファイル名を用いる。このときにも、カラムができているイメージというのは当てはまるだろう。
以上が、保存までの流れ。
以下は、表示するまでの流れ。
###3. HTMLのimg要素として生成
image_tagメソッド
というヘルパーメソッドを用いて、HTMLにimgタグを生成する。
<%= image_tag モデル名.ファイル名 %>
<%= image_tag message.image %> #例
アソシエーションしているため、モデル名.ファイル名
だけの記述で画像を表示させられる。
基本的にはここまでで、画像を表示できる。しかしこのままでは、画像が必ずなければ、エラーになってしまう。
###4. エラーの解消
先のimage_tagメソッド
にif文で条件分岐させる。
<%= image_tag message.image, if message.image.attached? %>
attached?メソッド
で画像が添付されていると、trueを返し、読み込まれる。画像が添付されていないと、falseを返し、読み込まれず、エラーが起きない。
###5. 画像の大きさ調整
ActiveStorageを導入していると使えるメソッドのvariantメソッド
を使う。
先のコードに付け足すと、
<%= image_tag message.image.variant(resize: '500×500'), if message.image.attached? %>
画像の表示サイズを指定すると、それ以上に大きくならない。
###6. バリデーションの設定
現状だと、LINEをイメージすると、テキストと画像が必ず両方ないとエラーになる。使い勝手がよくないため、テキストと画像のどちらかが存在すればよい、という仕様にする。
validates :message, presence: true, unless: :was_attacher?
def was_attached?
self.image.attached?
end
メソッドの返り値がfalseならば、バリデーションの検証を行う。(messageが存在しないとダメ)
##最後に
アソシエーションするだけで、簡単に画像にアクセスできるのが便利すぎる!!