Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@niwa1903

【rails】Active Storage

More than 1 year has passed since last update.

Active Storage

active_storage_attachments

id name record_type record_id blob_id
1 avatar Taxonomy 3 1
10 eye_catch Article 13 10
14 og_image Site 1 14
17 favicon Site 1 17

record_type model名
name has_one_attachedの関連付け
record_id articlesテーブルのid
blob_id active_storage_blobsテーブルのid


record_type = Article
name = eye_catch

article.rb
has_one_attached :eye_catch

active_storage_blobs

説明部分のみ抜粋

id filename content_type
1 IMG_4837.jpg image/jpeg
10 サイバスター.jpg image/jpeg
14 ジャスティス.jpg image/jpeg
17 SSLプロトコルスタック.png image/png

filename ファイルの実体
content_type 拡張子のタイプ

site.rb
validates :og_image, attachment: { purge: true, content_type: %r{\Aimage/(png|jpeg)\Z}, maximum: 524_288_000 }
validates :favicon, attachment: { purge: true, content_type: %r{\Aimage/png\Z}, maximum: 524_288_000 }

許可するcontent_typeを指定できる。

attached?

リファレンス

avatar.attached?で特定のuserがavatarを持っているかどうかを調べられる。

Current.user.avatar.attached?

variantメソッド

  • Variantを使うと新しい画像サイズが欲しくなった時に、オンデマンドで画像が生成される
# 200px * 200pxの画像にリサイズされた画像を表示
images.variant(resize: '200x200').processed

processedをつけることで、すでにそのサイズで保存されて画像があれば、変換処理は行われず、即時にURLが返される。

複数枚アップロード

レコードとファイルの間に1対多の関係を設定。
各レコードには、多数の添付ファイルをアタッチできる。

site.rb
has_many_attached :images

multiple: trueを設定

任意のview
= form_with model: [:admin, @site], url: admin_site_path do |f|
  = f.label :images
  = f.file_field :images, multiple: true

simple_form_for使用時は書式が変わるため気をつける
(検証ツールでmultipleが付与されているか確認すればこの点に気づける)

= simple_form_for [:admin, @site], url: admin_site_path do |f|
  = f.input :images, as: :file, input_html: { multiple: true }
def site_params
    params.require(:site).permit(:name, :favicon, :og_image, main_images: [])
end

空の配列にimagesが入る受け入れ準備。
multiple: trueにするとインターフェースが変わるため注意。

🙅‍♀️ params.require(:site).permit(:main_images)
🙆‍♂️ params.require(:site).permit(main_images: [])

active_storage_attachmentsからインスタンス取得

ActiveStorage.png

active_storage_attachmentsの主キーがわかっていれば
ActiveStorage::Attachment.find(params[:id])
attachmentsテーブルからインスタンスを取得できる。

site/edit.html.slim
- if @site.og_image.attached?
  = image_tag @site.og_image_url(:ogp), class: 'img-responsive'
  = link_to '削除', admin_site_attachment_path(@site.og_image.id), class: 'btn btn-danger',
    method: :delete

@site.og_image.idでog_imageのidを引数としてコントローラに渡すことで

sites_controller.rb
ActiveStorage::Attachment.find(params[:id])

そのIDを使用してAttachment全体から合致するインスタンスを取得することができる。
(渡ってきたIDはAttachmentテーブルのものでなければならない)

ActiveStorage_加工.png

今回@site.og_image.idで取ってきたIDは赤丸のID。
このIDと紐づいたblobsから情報を取得できる。

2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
niwa1903
エンジニアなりたて
runteq
Webエンジニア就職に強いプログラミングスクールのRUNTEQ(ランテック)です。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?