[Ruby on Rails] Supprimer les images s3 avec Active Strage

Cible

Supprimer les images sur s3 ainsi que local

supposition

À propos de la suppression d'images avec Active Strage Je suis coincé, alors je vais le laisser comme un mémorandum. (Veuillez noter qu'il s'agit d'une description maladroite, donc cela peut être un gaspillage.)

Supprimez également les images inutiles sur s3.

modèle de poste Nom de colonne: chaîne Action nouvel index afficher modifier mettre à jour créer détruire La racine réside: messages

Environnement de développement

ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina heroku

Introduction de la publication d'images avec Active Strage

[Rails 5.2] Comment utiliser Active Storage C'était très facile à comprendre et à introduire, donc Veuillez l'introduire en vous référant ici.

[Rails] Comment activer la publication d'images dans Heroku (ActiveStorage + Amazon S3) Veuillez également vous y référer lors du déploiement sur heroku.

À propos de la suppression d'images avec Active Strage

C'est le sujet principal. Le Guide Rails décrit comment le supprimer et utilise la méthode de purge. En utilisant cette méthode de purge, vous pouvez supprimer l'image s3 directement à partir de l'application rails.

python


#Détruisez de manière synchrone l'avatar et le fichier de ressources réel.
user.avatar.purge

#Détruit de manière asynchrone le modèle associé et le fichier de ressources réel via Active Job.
user.avatar.purge_later

À propos de la suppression d'une image

Dans le cas où vous devez supprimer l'image de s3 (1) Lors de la mise à jour de l'image (2) Il est possible que le message associé à l'image ait été supprimé. De plus, la raison n'a pas encore été clarifiée, mais si vous utilisez purge au lieu de purge_later Parce que l'action de destruction n'a pas été détruite et que l'instruction if est devenue fausse. L'utilisation de purge_later a bien fonctionné. Pour supprimer une image, purge_later peut devoir être détruit de manière asynchrone.

L'ordre de @ post.image.purge_later && @ post.destroy Si vous faites d'abord @ post.destroy, @ post.image.purge_later Je pense que cela affectera le problème du serveur d'aws, donc je le fais dans cet ordre.

app/controllers/posts_controller.rb


  def update
    @post = Post.find(params[:id])
    if @post.image.attached?
      @post.image.purge_later
    end
    if @post.update(post_params)
      redirect_to post_path(@post)
    else
      render :edit
    end
  end

  def destroy
    @post = Post.find(params[:id])
    if @post.image.attached?
      if @post.image.purge_later && @post.destroy
        redirect_to posts_path
      else
        render :edit
      end
    else
      if @post.destroy
        redirect_to posts_path
      else
        render :edit
      end
    end
  end

  private
  def post_params
    params.require(:post).permit(:name, :image)
  end

À propos de la suppression de plusieurs images

Publication / suppression de plusieurs images avec Active Storage J'ai essayé de l'implémenter en me référant à cet article, Dans mon environnement de développement

ActiveSupport::MessageVerifier::InvalidSignature


 Parce que je n'ai pas pu le résoudre à cause de l'erreur
 J'ai décidé de supprimer toutes les images.
 Par conséquent, nous avons ajouté une nouvelle action img_destroy.

 De plus, si vous utilisez purge_later pour supprimer plusieurs images au lieu de supprimer une image,
 Parfois une erreur (je ne me souviens pas des détails, mais il y a trop de traitement?)
 Il peut sortir, mais l'utilisation de la purge a bien fonctionné.

 L'ordre de @ post.image.purge && @ post.destroy
 Si vous faites d'abord @ post.destroy, @ post.image.purge
 Je pense que cela affectera le problème du serveur d'aws, donc je le fais dans cet ordre.


#### **`python`**
```rb

  def update
    @post = Post.find(params[:id])
    if @post.update(post_params)
      redirect_to post_path(@post)
    else
      render :edit
    end
  end

  def destroy
    @post = Post.find(params[:id])
    if @post.images.attached?
      if @post.images.purge && @post.destroy
        redirect_to posts_path
      else
        render :edit
      end
    else
      if @post.destroy
        redirect_to posts_path
      else
        render :edit
      end
    end
  end

  def img_destroy
    @post = Post.find(params[:id])
    if @post.images.purge
      redirect_to edit_post_path(@post)
    else
      render :edit
    end
  end

  private
  def post_params
    params.require(:post).permit(:name,images: [])
  end

config/routes.rb


delete 'post_image_delete/:id', to: 'posts#img_destroy', as: 'post_img_destroy'

erb:app/views/posts/edit.html.erb


<% if @post.images.attached? %>
  <%= link_to "Tout supprimer", post_img_destroy_path(@post), method: :delete, "data-confirm" => "Es-tu sûr de vouloir le supprimer?", class: "btn btn-danger" %>
<% end %>

Résumé

C'était une méthode pour supprimer l'image de s3 avec Active Strage, Il y a peut-être une meilleure façon de l'écrire pour tâtons.

J'ai moi-même déménagé vers ActiveStorage car je ne pouvais pas résoudre l'erreur gem refile-s3. J'espère pouvoir aider les gens dans la même situation. Pour plus d'informations ici

De plus, sur Twitter, les technologies et les idées qui n'ont pas été téléchargées sur Qiita sont également téléchargées, donc Je vous serais reconnaissant si vous pouviez me suivre. Cliquez ici pour plus de détails https://twitter.com/japwork

Recommended Posts

[Ruby on Rails] Supprimer les images s3 avec Active Strage
[Ruby on Rails] Téléversement de plusieurs images avec refile
[Ruby on Rails] Afficher le test avec RSpec
Remarques sur l'utilisation de FCM avec Ruby on Rails
[Ruby on Rails] Test du contrôleur avec RSpec
Commande de création / suppression du contrôleur Ruby on Rails
[Ruby on Rails] À propos du rappel Active Record
[Ruby on Rails] Test de modèle avec RSpec
Publier / supprimer plusieurs images avec Active Storage
Présentation de Rspec avec Ruby on Rails x Docker
Publiez l'application avec ruby on rails
[Rails] Procédure de liaison de bases de données avec Ruby On Rails
Déterminez la page actuelle avec Ruby on Rails
[Ruby on Rails] Fonction de post-édition (mise à jour, suppression)
J'ai fait un portfolio avec Ruby On Rails
[Rails 6] Erreur d'exécution avec $ rails s
Ruby on Rails élémentaire
Principes de base de Ruby on Rails
Association Ruby On Rails
Exécutez des tests Ruby on Rails RSpec avec des actions GitHub
Création d'un plan de site au format RSS / Atom avec Ruby on Rails
Record d'apprentissage de Ruby on rails -2020.10.03
Record d'apprentissage Ruby on rails -2020.10.04
[Ruby on Rails] Debuck (binding.pry)
Record d'apprentissage de Ruby on rails -2020.10.05
Record d'apprentissage de Ruby on rails -2020.10.09
Tester Active Strage avec RSpec
Record d'apprentissage Ruby on rails-2020.10.07 ②
Record d'apprentissage Ruby on rails-2020.10.07 ①
Annuler la migration de Ruby on Rails
Record d'apprentissage de Ruby on rails -2020.10.06
Résumé de la validation Ruby on Rails
Mémorandum de base Ruby on Rails
J'ai essayé d'installer le plugin lié à Ruby on Rails avec vim-plug
[Ruby on Rails] Ajouter une colonne avec des contraintes de clé externe
Supprimer tout le contenu de la page de liste [Ruby on Rails]
[Ruby on Rails] Implémenter la fonction de connexion par add_token_to_users avec l'API
Installez Ruby sur MSYS2 avec pacman
[Ruby on Rails] Read try (: [] ,: key)
Variables Ruby on Rails, résumé constant
[Ruby on Rails] Introduction de la fonction de pagination
Je souhaite ajouter une fonction de navigation avec ruby on rails
Création d'un environnement de développement pour Ruby on Rails à l'aide de Docker + VSCode (Remote Container)
Connaissance de base de Ruby on Rails
Déplacer le stockage actif sur S3 localement
Progatez Ruby on Rails
Comment utiliser Ruby on Rails
Comprendre la couverture du code avec Rspec, le framework de test Ruby on Rails
Programmation avec ruby (en route)
Ruby on Rails compatible japonais-anglais i18n
(Ruby on Rails6) "Effacer" le contenu publié