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!
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. ** ** **
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
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