[RUBY] [Rails] So lösen Sie das Problem, dass das Standardbild beim Bearbeiten überschrieben wird, ohne das Bild hochzuladen [Active Storage]

Ich habe einen neuen Fehler gefunden, während meine persönlich entwickelte App fast fertig ist ... (Ich bin froh, dass ich ihn bemerkt habe, bevor er veröffentlicht wurde)

Die Einführung ist lang. Wenn Sie die Lösung schnell kennenlernen möchten, überspringen Sie diesen Bereich! !!

Ich habe die Funktion zum Hochladen von Bildern wie Profilbilder mit ActiveStorage implementiert, aber die folgenden Fehler wurden gefunden. Angenommen, ein Benutzer legt ein Bild auf einer Benutzerbearbeitungsseite fest. Angenommen, Sie möchten Ihr Passwort ändern. Natürlich gibt der Benutzer nur das neue Passwort ein und dieser Wert wird aus dem Formular auf der Bearbeitungsseite veröffentlicht. Zu diesem Zeitpunkt wird das zuvor hochgeladene Bild nicht im Dateiauswahlbereich (file_field) des Formulars festgelegt. Wenn die Aktualisierungsaktion in diesem Status ausgeführt wird, verschwindet das zuvor hochgeladene Bild und wird in der Anwendung festgelegt. Es wird mit dem Standardbild überschrieben.

Mit anderen Worten, es bietet dem Benutzer die schlechteste UX, in der die Bildänderungen nicht beibehalten werden können, es sei denn, das Bild wird jedes Mal hochgeladen, wenn das Bild bearbeitet wird. Das muss gemacht werden, also schreibe ich eine Lösung!

Lösung (super einfach)

Fügen Sie dem Controller Folgendes hinzu.

users_controller.rb


def update
    @user = User.find(params[:id])
    @user.avatar.attach(params[:avatar]) if @user.avatar.blank?
    if @user.update(user_params)
      flash[:success] = 'Ich habe mein Profil aktualisiert'
      redirect_to @user
    else
      render 'edit'
    end
  end

Fügen Sie einfach ** hinzu, wenn @ user.avatar.blank? **! Eigentlich wusste ich nicht, wie ich einen Cache mit Bildern erstellen sollte, die bereits in Active Storage festgelegt waren, unabhängig davon, ob ich gegoogelt oder gegoogelt habe. Als Ergebnis des Denkens für mich und der Überprüfung verschiedener Hypothesen konnte ich diesen Satz finden und lösen. Ich tat. (Es kam mit CarrierWave heraus) Ich habe bestätigt, dass der Test auch bestanden hat. (Es wurde bestätigt, dass der Test ordnungsgemäß fehlschlägt, wenn dieser Satz gelöscht wird.)

Aber damit

** Wenn Sie das bereits festgelegte Bild normal ändern möchten, wird "@ user.avatar.bkank" falsch und "@ user.avatar.attach (params [: avatar])" Ist es nicht möglich, das Bild zu ändern, ohne `` auszuführen? ** ** **

Findest du nicht auch? Ich denke. .. Selbst mit w wird das eigentliche Bild aktualisiert und der Test besteht, daher werde ich dies vorerst verwenden.

** Wenn jemand das Prinzip hier versteht, würde ich es begrüßen, wenn Sie einen Kommentar abgeben könnten. ** ** **

Testcode

Als Ergänzung wird hier der tatsächlich bestandene Testcode veröffentlicht (nur der relevante Teil wird extrahiert).

upload_image_spec.rb


require 'rails_helper'

RSpec.describe 'Bild hochladen', type: :system do
  let(:user) { FactoryBot.create(:user) }

  before do
    valid_login(user)
  end

  #Bilder hochladen und speichern
  def upload_user_avatar(user)
    visit edit_user_path(user)
    attach_file 'user_avatar', "#{Rails.root}/spec/fixtures/images/test.jpg "
    click_on 'sparen'
  end

  it 'Das vom Benutzer hochgeladene Bild wird auf Meine Seite angezeigt' do
    upload_user_avatar(user)
    expect(page).to have_selector("img[src$='test.jpg']")
  end

  it "Dem Benutzer gelingt es, das Bild zu aktualisieren" do
    visit edit_user_path(user)
    attach_file 'user_avatar', "#{Rails.root}/spec/fixtures/images/updated_test.jpg "
    click_on 'sparen'
    expect(page).to have_selector("img[src$='updated_test.jpg']")
  end

  it "Beim Bearbeiten ohne Hochladen eines Bildes sollte es nicht mit den Standardbilddaten überschrieben werden" do
    upload_user_avatar(user)
    visit edit_user_path(user)
    click_on 'sparen'
    expect(page).to have_selector("img[src$='test.jpg']")
  end
end

Vielen Dank für das Lesen bis zum Ende!

Ich gebe aus, was ich jeden Tag gelernt habe! Wenn Sie Vorschläge haben, wäre ich Ihnen dankbar, wenn Sie einen Kommentar abgeben könnten! !!

Recommended Posts

[Rails] So lösen Sie das Problem, dass das Standardbild beim Bearbeiten überschrieben wird, ohne das Bild hochzuladen [Active Storage]
So lösen Sie das Problem, dass das Website-Image nach der Bereitstellung auf Heroku in Rails 5 nicht angezeigt wird
So lösen Sie das Problem, wenn der Wert nicht gesendet wird, wenn das Formular in Schienen deaktiviert und gesendet wird
So lösen Sie das Problem, dass die Bean beim Verschachteln in Spring Batch nicht ordnungsgemäß verarbeitet wird
[Rails] Verwendung von Active Storage
Fälle, in denen Benutzer beim Bearbeiten einer App abgemeldet sind (Rails)
So lösen Sie das Problem, dass unter iOS14 keine Benachrichtigung angefordert werden kann
Turbolinks: Ich möchte das Problem lösen, dass JS nicht richtig angezeigt wird, es sei denn, es wird beim Übergang mit link_to neu geladen
[Rails] Lösung, wenn bei Verwendung von Capybara mit Rspec der Fehler "undefined method` visit '" angezeigt wird
[Schienen] So zeigen Sie Bilder in der Ansicht an
Lösung für das Problem, dass zelleninterne Zeilenumbrüche verstärkt werden, wenn EXCEL mit SXSSF Workbook (3.16 oder älter) ausgegeben wird.
Wann wird der Standardwert ohne explizite Initialisierung automatisch eingegeben?
[Rails] So konvertieren Sie den URI des von http gesendeten Bildes in https, wenn Sie die Twitter-API verwenden
Problemuntersuchung, dass JST in +0000 +0000 konvertiert wird, wenn die Golang-Zeitzonenkonvertierung für das alpine Docker-Image durchgeführt wird
So beheben Sie das Problem, dass beim Stoppen der Webanwendung kein Protokollierungsprotokoll ausgegeben wird
[Rails] So lösen Sie ActiveSupport :: MessageVerifier :: InvalidSignature, von dem ich bei der Einführung des Twitter-Logins abhängig war [ActiveStorage]
So geben Sie den Wert aus, wenn sich ein Array im Array befindet
Ich habe versucht zu verstehen, wie die Rails-Methode "redirect_to" definiert ist
Ich habe versucht zu verstehen, wie die Rails-Methode "link_to" definiert ist
So identifizieren Sie den Pfad, auf dem leicht Fehler gemacht werden können
So beheben Sie den unbekannten Fehler, der bei der Verwendung von slf4j in Java aufgetreten ist
[Rails 5] Anzeigen des Bildschirms zum Ändern des Kennworts bei Verwendung von devise
[rails6.0.0] Speichern von Bildern mit Active Storage im Assistentenformat
[IOS] Was tun, wenn das Bild mit einer Farbe gefüllt ist?
[Schienen] Über den Fehler, dass das Bild nicht in der Produktionsumgebung angezeigt wird
[Docker] Erstellen, wenn der Quellcode auf dem Container gebunden ist
So lösen Sie die lokale Umgebungskonstruktion von Ruby on Rails (MAC)!
[Rails] So lösen Sie die Zeitverzögerung von created_at nach der Speichermethode
[Schienen] Was tun, wenn das Refile-Bild beim Schreiben der Verarbeitung zum Zeitpunkt des Routing-Fehlers nicht angezeigt wird?
So beheben Sie den Fehler 'ActionView :: Template :: Error' (Das Asset "application.css" ist in der Asset-Pipeline nicht vorhanden. '"Beim Vorkompilieren von Rails-Assets
Was tun gegen "Ein Server läuft bereits ...", ohne dass der Rails-Server im Terminal ausgeschaltet wurde