質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

1296閲覧

【追記有】ユーザーを削除しても dependent: :destroy が効かず AWS S3 内に関連画像が残り続ける。

punchan36

総合スコア105

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2022/01/06 08:23

編集2022/01/10 11:10

前提・実現したいこと

プロフィール画像等の保存先に AWS S3 を指定致しました。接続はうまくいっており、ローカル環境で保存した画像が AWS S3 のバケットに保存されている様子が以下の様に確認できました。

  • アップロードした画像を右クリック → 画像アドレスをコピーしたところ、画像アドレスが以下になっていた。

http://localhost:3000/rails/active_storage/blobs/...略

  • AWS S3 のバケット > オブジェクトを確認したところ該当ファイルが追加されていた。

モデルに以下の様に dependent: :destroy を記述する事で以前は関連画像も削除されたように記憶しているのですが、改めて確認した所バケット内の画像が削除されておりませんでした。エラーメッセージは特に表示されておりません。

user.rb

class User < ApplicationRecord has_one_attached :image_name, dependent: :destroy has_one_attached :cover_image_name, dependent: :destroy end

直接関係があるかは分かりませんが、最近行った作業にも言及致します。
Qiita記事を参考に最近アプリ名を変更致しました。旧名のデータベースを drop してから、renameと言う gem を使い新たな名前と共に作り直すと言う内容です。

古い名前のデータベースは削除致しましたが、旧名のデータベースに保存されていたユーザーの関連画像は AWS S3 内に保存されたままです。
また現在名のデータベースにおいてユーザー及びプロフィール画像の作成を試みた所、冒頭で言及致しました通りバケット内に画像が保存されました。しかし User.find(1).destroy を試みるも、ユーザーはデータベースから消えるもののバケット内には画像が残ったままになる状況です。

ユーザーが削除されると関連画像もバケット内から自動で削除されるよう設定したいです。
どなたかご助言を頂けますと有難いです。

補足情報(FW/ツールのバージョンなど)

ruby 2.6.8p205 (2021-07-07 revision 67951) [x64-mingw32]
RubyGems 3.0.3.1
Rails 5.2.6
mysql Ver 14.14 Distrib 5.7.36, for Win64 (x86_64)

追記

またユーザーがプロフィール画像を 画像A → 画像B に変更した場合も、画像A, 画像Bともに AWS S3 に保存されてしまいます。画像Aのデータが消えて画像Bに差し替わる挙動になって欲しいのですが…。

更に、ユーザーがプロフィール画像を 画像A → 画像A → 画像A… と同じファイルで何度もアップロードした場合も、AWS S3 内でその数だけ 画像A のオブジェクトが追加されます。同一のファイルをアップロードした場合、オブジェクト内で変化は起こらなかったと思うのですが…。
八方塞がりな状況ですので、コメントだけでも頂けますと有難いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

AWS S3 の仕様に関して、質問文にも記載しておりました私の以下の認識に勘違いがありました。申し訳ありません。

  • ユーザーを削除した場合 dependent: :destroy を通して、関連画像も S3 バケット内から削除される。
  • ユーザーのプロフィール画像がアップデートされた場合、S3 バケット内にある古い画像の情報は新しい画像の情報に差し変わる。

実際には、ファイルの削除に関する記述を自分で書かない限り、S3 はデフォルトでは何もしてくれないと言う設定でした。

ですので今回は以下2点の内容を記述する事で、希望していた機能を実装する事が出来ました。
0. ユーザーを削除する際、関連画像を S3 バケット内から削除させる。
0. ユーザーのプロフィール画像がアップデートされた場合、S3 バケット内にある古い画像の情報は新しい画像の情報に差し変える。

user.rb

# 1に関する記述 def destroy @user = User.find_by(id: params[:id]) @user.image_name.purge if @user.image_name.attached? @user.cover_image_name.purge if @user.cover_image_name.attached? @user.destroy end

記述するファイルはどこでも可

# 2に関する記述 ActiveStorage::Blob.unattached.find_each(&:purge)

投稿2022/01/11 08:45

punchan36

総合スコア105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問