[Ruby on Rails] Löschen Sie s3-Bilder mit Active Strage

Ziel

Löschen Sie Bilder sowohl auf s3 als auch lokal

Annahme

Informationen zum Löschen von Bildern mit Active Strage Ich stecke fest, also lasse ich es als Memorandum. (Bitte beachten Sie, dass dies eine fummelige Beschreibung ist, daher kann es verschwenderisch sein.)

Löschen Sie auch unnötige Bilder auf s3.

Postmodell Spaltenname: Zeichenfolge Aktion neuer Index show edit update create destroy Stammwohnheime: Beiträge

Entwicklungsumgebung

ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina heroku

Bildposting mit Active Strage eingeführt

[Rails 5.2] Verwendung von Active Storage Das war sehr leicht zu verstehen und leicht einzuführen Bitte stellen Sie es hier vor.

[Rails] So aktivieren Sie das Posten von Bildern in Heroku (ActiveStorage + Amazon S3) Bitte beachten Sie dies auch bei der Bereitstellung auf Heroku.

Informationen zum Löschen von Bildern mit Active Strage

Dies ist das Hauptthema. Das Rails-Handbuch beschreibt das Löschen und verwendet die Bereinigungsmethode. Mit dieser Bereinigungsmethode können Sie das Image von s3 direkt aus der Rails-App löschen.

python


#Zerstöre synchron den Avatar und die eigentliche Ressourcendatei.
user.avatar.purge

#Zerstört asynchron das zugehörige Modell und die eigentliche Ressourcendatei über Active Job.
user.avatar.purge_later

Informationen zum Löschen eines Bildes

In dem Fall, dass Sie das Bild von s3 löschen müssen (1) Beim Aktualisieren des Bildes (2) Möglicherweise wurde der mit dem Bild verknüpfte Beitrag gelöscht. Auch der Grund wurde noch nicht geklärt, aber wenn Sie purge anstelle von purge_later verwenden Weil die Zerstörungsaktion nicht zerstört wurde und die if-Anweisung falsch wurde. Die Verwendung von purge_later hat gut funktioniert. Zum Löschen eines Bildes muss purge_later möglicherweise asynchron zerstört werden.

Die Reihenfolge von @ post.image.purge_later && @ post.destroy Wenn Sie zuerst @ post.destroy ausführen, wird @ post.image.purge_later dies tun Ich denke, dass es die Serverprobleme von aws beeinflussen wird, also mache ich es in dieser Reihenfolge.

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

Informationen zum Löschen mehrerer Bilder

Veröffentlichen / Löschen mehrerer Bilder mit Active Storage Ich habe versucht, es unter Bezugnahme auf diesen Artikel zu implementieren. In meiner Entwicklungsumgebung

ActiveSupport::MessageVerifier::InvalidSignature


 Weil ich es wegen des Fehlers nicht lösen konnte
 Ich habe beschlossen, alle Bilder zu löschen.
 Daher haben wir eine neue Aktion img_destroy hinzugefügt.

 Wenn Sie purge_later verwenden, um mehrere Bilder zu löschen, anstatt nur ein Bild zu löschen,
 Gelegentlich ein Fehler (Ich erinnere mich nicht an die Details, aber es wird zu viel verarbeitet?)
 Es kann herauskommen, aber die Verwendung der Spülung hat gut funktioniert.

 Die Reihenfolge von @ post.image.purge && @ post.destroy
 Wenn Sie zuerst @ post.destroy ausführen, wird @ post.image.purge dies tun
 Ich denke, dass es die Serverprobleme von aws beeinflussen wird, also mache ich es in dieser Reihenfolge.


#### **`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 "Alles löschen", post_img_destroy_path(@post), method: :delete, "data-confirm" => "Möchten Sie es wirklich löschen?", class: "btn btn-danger" %>
<% end %>

Zusammenfassung

Es war eine Methode, um das Bild von s3 zusammen mit Active Strage zu löschen. Es gibt vielleicht einen besseren Weg, es zum Tappen zu schreiben.

Ich selbst bin zu ActiveStorage gewechselt, weil ich den gem refile-s3-Fehler nicht beheben konnte. Ich hoffe, ich kann Menschen in der gleichen Situation helfen. Weitere Informationen hier

Auf Twitter werden auch Technologien und Ideen hochgeladen, die nicht auf Qiita hochgeladen wurden Ich wäre Ihnen dankbar, wenn Sie mir folgen könnten. Klicken Sie hier für Details https://twitter.com/japwork

Recommended Posts

[Ruby on Rails] Löschen Sie s3-Bilder mit Active Strage
[Ruby on Rails] Hochladen mehrerer Bilder mit Refile
[Ruby on Rails] Test mit RSpec anzeigen
Hinweise zur Verwendung von FCM mit Ruby on Rails
[Ruby on Rails] Controller-Test mit RSpec
Befehl zum Erstellen / Löschen des Ruby on Rails-Controllers
[Ruby on Rails] Informationen zum Active Record-Rückruf
[Ruby on Rails] Modelltest mit RSpec
Veröffentlichen / Löschen mehrerer Bilder mit Active Storage
Einführung in Rspec mit Ruby on Rails x Docker
Veröffentlichen Sie die mit Ruby on Rails erstellte App
[Rails] Verfahren zum Verknüpfen von Datenbanken mit Ruby On Rails
Bestimmen Sie die aktuelle Seite mit Ruby on Rails
[Ruby on Rails] Nachbearbeitungsfunktion (Aktualisieren, Löschen)
Ich habe mit Ruby On Rails ein Portfolio erstellt
[Rails 6] Laufzeitfehler mit $ Rails s
Ruby on Rails Elementary
Ruby on Rails Grundlagen
Ruby On Rails Association
Führen Sie Ruby on Rails RSpec-Tests mit GitHub-Aktionen aus
Site Map im RSS / Atom-Format mit Ruby on Rails erstellt
Ruby on Rails Lernrekord -2020.10.03
Ruby on Rails Lernrekord -2020.10.04
[Ruby on Rails] Debuck (bindend.pry)
Ruby on Rails Lernrekord -2020.10.05
Ruby on Rails Lernrekord -2020.10.09
Testen Sie Active Strage mit RSpec
Ruby on Rails lernen Rekord-2020.10.07 ②
Ruby on Rails lernen Rekord-2020.10.07 ①
Brechen Sie die Ruby on Rails-Migration ab
Ruby on Rails Lernrekord -2020.10.06
Zusammenfassung der Ruby on Rails-Validierung
Ruby on Rails Grundlegendes Memorandum
Ich habe versucht, das Ruby on Rails-Plugin mit vim-plug zu installieren
[Ruby on Rails] Fügen Sie eine Spalte mit externen Schlüsselbeschränkungen hinzu
Alle Inhalte der Listenseite löschen [Ruby on Rails]
[Ruby on Rails] Implementieren Sie die Anmeldefunktion von add_token_to_users mit API
Installieren Sie Ruby mit pacman auf MSYS2
[Ruby on Rails] Leseversuch (: [],: Schlüssel)
Ruby on Rails-Variablen, konstante Zusammenfassung
[Ruby on Rails] Paging-Funktion eingeführt
Ich möchte eine Browsing-Funktion mit Ruby on Rails hinzufügen
Erstellen einer Entwicklungsumgebung für Ruby on Rails mit Docker + VSCode (Remote Container)
Grundkenntnisse in Ruby on Rails
Verschieben Sie Active Storage auf S3 lokal
Progate Ruby on Rails5 Rückblick
Verwendung von Ruby on Rails
Verstehen Sie die Codeabdeckung mit Rspec, dem Ruby on Rails-Testframework
Programmieren mit Ruby (unterwegs)
Ruby on Rails Japanisch-Englisch kompatibler i18n
(Ruby on Rails6) Gepostete Inhalte "löschen"