初めに
プログラミングスクールでは、Active Storageを使って1つの投稿に1枚の写真を保存する方法を学びました。今回、ポートフォリオ制作時に複数枚保存できるといいな、と思って色々調べて実装したのでここにまとめておきます。
完成形
- 新規投稿ボタンを押下すると、フォイル選択のフォルダが出てくる。
- Shitキーを押しながら複数枚画像を選択し、アップロードボタンを押下すると、複数枚の画像が投稿フォームに反映される。
- 投稿ボタンを押下すると、上記で詮索した画像とともに投稿される。
実装
それでは、実装していきます!
(画像の単数枚投稿が既に頭に入っているという前提で実装方法を説明していきます)
下準備(チェックリスト)
✅ 以下のgemをbundle install してますか?
gem "image_processing", ">= 1.2"
✅ 投稿を保存するモデル、テーブル、カラムを作っていますか?
※モデル、テーブル、カラムを作成するときに、画像を保存するためのカラムは必要ありません。
※ここではPostモデルとします。
✅ コントローラ、ビューは準備できていますか?
- controller:いつものように新規投稿をするときの記述です。
#例)今回はこの記述を使っていきます。
@post = Post.new
def post_params
params.require(:post).permit(:caption, :user_id)
end
- view: form_withを使って投稿フォームを作成していきます。
1. モデルの記述
post.rbに以下のように記述します。
has_many_attached :images
#画像複数枚投稿
(参考)以下の記述は、画像単数投稿の際の記述です👇
has_one_attached :image
#画像単数枚投稿
【単数枚投稿との相違点】
①oneがmanyになっている
②imageがimagesになっている
2. コントローラの記述
def post_params
params.require(:post).permit(:caption, :user_id, post_images: [])
end
(参考)以下の記述は、画像単数投稿の際の記述です👇
def post_params
params.require(:post).permit(:caption, :user_id, :image)
end
【単数枚投稿との相違点】
・ストロングパラメータで受け取る値が、配列になっている
3. ビューの記述
<%= form_with model: @post do |f| %>
<%= f.file_field :images, multiple: true, class: 'form-control' %>
<% end %>
#画像複数枚投稿
(参考)以下の記述は、画像単数投稿の際の記述です👇
<%= form_with model: @post do |f| %>
<%= f.file_field :image, class: 'form-control' %>
<% end %>
#画像単数枚投稿
【単数枚投稿との相違点】
①imageがimagesになっている
②form_withの記述に、multiple: true が追加されている
4. 完成!!でも問題点が...
これで機能は実装されました!
しかし、1つの投稿に画像を複数枚保存できるようになったことで問題点が生まれました。
サイトの動作がめっちゃ重くなった!!
この問題に関して、少しでも改善するように記述を変更したりしたので、後ほど記事にしてまとめておきます🤗
まとめ
参考資料はこちらです。
https://railsguides.jp/active_storage_overview.html
何か間違いや改善すべきところがあればご指摘ください!!