[RUBY] [Rails] Comment résoudre le problème d'écrasement de l'image par défaut lors de l'édition sans télécharger l'image [Active Storage]

J'ai trouvé un nouveau bogue alors que mon application développée personnellement est presque terminée ... (je suis content de l'avoir remarqué avant sa sortie)

L'introduction est longue, donc si vous voulez connaître la solution rapidement, veuillez sauter cette zone! !!

J'ai implémenté la fonction de téléchargement d'image telle que l'image de profil en utilisant ActiveStorage, mais les bogues suivants ont été trouvés. Par exemple, supposons qu'un utilisateur définit une image sur une page d'édition utilisateur. Et puis supposons que vous vouliez changer votre mot de passe. Naturellement, l'utilisateur n'entre que le nouveau mot de passe et cette valeur est publiée à partir du formulaire sur la page d'édition. À ce stade, l'image précédemment téléchargée n'est pas définie dans la zone de sélection de fichier (champ_fichier) du formulaire, donc si l'action de mise à jour est exécutée dans cet état, l'image précédemment téléchargée disparaîtra et elle est définie dans l'application. Il sera écrasé par l'image par défaut.

En d'autres termes, il fournit à l'utilisateur le pire UX que l'image change ne peut pas être maintenue à moins que l'image ne soit téléchargée à chaque fois que l'image est modifiée. Cela doit être fait, alors je vais écrire une solution!

Solution (super facile)

Ajoutez ce qui suit au contrôleur.

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] = 'J'ai mis à jour mon profil'
      redirect_to @user
    else
      render 'edit'
    end
  end

Ajoutez simplement ** if @ user.avatar.blank? **! En fait, je ne savais pas comment créer un cache d'images déjà définies dans Active Storage, que j'aie googlé ou Google, donc en réfléchissant par moi-même et en vérifiant diverses hypothèses, j'ai pu trouver cette phrase et la résoudre. J'ai fait. (Il est sorti avec CarrierWave) J'ai confirmé que le test avait également réussi. (Il a été confirmé que le test échouera correctement si cette phrase est effacée)

Mais avec ça

** Si vous voulez changer l'image déjà définie normalement, @ user.avatar.bkank? '' Devient faux et @ user.avatar.attach (params [: avatar]) ` N'est-il pas possible de changer l'image sans exécuter? ** **

Tu ne penses pas? Je pense. .. Même avec w, l'image réelle est mise à jour et le test réussit, donc je vais l'utiliser pour le moment.

** Si quelqu'un comprend le principe ici, je vous serais reconnaissant si vous pouviez commenter. ** **

Code de test

En complément, le code de test qui a réellement réussi est affiché ici (seule la partie pertinente est extraite).

upload_image_spec.rb


require 'rails_helper'

RSpec.describe 'Télécharger l'image', type: :system do
  let(:user) { FactoryBot.create(:user) }

  before do
    valid_login(user)
  end

  #Télécharger et enregistrer des images
  def upload_user_avatar(user)
    visit edit_user_path(user)
    attach_file 'user_avatar', "#{Rails.root}/spec/fixtures/images/test.jpg "
    click_on 'enregistrer'
  end

  it 'L'image téléchargée par l'utilisateur s'affiche sur Ma page' do
    upload_user_avatar(user)
    expect(page).to have_selector("img[src$='test.jpg']")
  end

  it "L'utilisateur réussit à mettre à jour l'image" do
    visit edit_user_path(user)
    attach_file 'user_avatar', "#{Rails.root}/spec/fixtures/images/updated_test.jpg "
    click_on 'enregistrer'
    expect(page).to have_selector("img[src$='updated_test.jpg']")
  end

  it "Lors de l'édition sans télécharger une image, elle ne doit pas être écrasée par les données d'image par défaut" do
    upload_user_avatar(user)
    visit edit_user_path(user)
    click_on 'enregistrer'
    expect(page).to have_selector("img[src$='test.jpg']")
  end
end

Merci d'avoir lu jusqu'au bout!

Je sort ce que j'ai appris tous les jours! Si vous avez des suggestions, je vous serais reconnaissant de bien vouloir commenter! !!

Recommended Posts

[Rails] Comment résoudre le problème d'écrasement de l'image par défaut lors de l'édition sans télécharger l'image [Active Storage]
Comment résoudre le problème que l'image du site Web ne s'affiche pas après le déploiement sur heroku dans Rails 5
Comment résoudre le problème lorsque la valeur n'est pas envoyée lorsque le formulaire est désactivé dans les rails et envoyé
Comment résoudre le problème que le bean n'est pas traité correctement lorsqu'il est imbriqué dans Spring Batch
[Rails] Comment utiliser Active Storage
Cas où les utilisateurs sont déconnectés lors de la modification d'une application (rails)
Comment résoudre le problème selon lequel la notification ne peut pas être demandée sur iOS14
Turbolinks: je veux résoudre le problème que JS ne s'affiche pas correctement à moins d'être rechargé lors de la transition avec link_to
[Rails] Solution lorsque l'erreur "visite de la méthode non définie" "apparaît lors de l'utilisation de Capybara avec Rspec
[Rails] Comment afficher les images dans la vue
Solution au problème que les ruptures de ligne intra-cellulaires sont amplifiées lorsque EXCEL est généré à l'aide du classeur SXSSF (3.16 ou version antérieure)
Quand la valeur par défaut est-elle automatiquement saisie sans initialisation explicite?
[Rails] Comment convertir l'URI de l'image envoyée par http en https lors de l'utilisation de l'API Twitter
Analyse du problème selon lequel JST est converti en +0000 +0000 lorsque la conversion du fuseau horaire de Golang est effectuée sur l'image du docker Alpine
Comment résoudre le problème de non-sortie du journal de connexion lorsque l'application Web est arrêtée
[Rails] Comment résoudre ActiveSupport :: MessageVerifier :: InvalidSignature auquel j'étais accro lors de l'introduction de la connexion Twitter [ActiveStorage]
Comment afficher la valeur lorsqu'il y a un tableau dans le tableau
J'ai essayé de comprendre comment la méthode des rails "redirect_to" est définie
J'ai essayé de comprendre comment la méthode des rails "link_to" est définie
Comment identifier le chemin sur lequel il est facile de se tromper
Comment résoudre l'erreur inconnue apparue lors de l'utilisation de slf4j en Java
[Rails 5] Comment afficher l'écran de changement de mot de passe lors de l'utilisation de l'appareil
[rails6.0.0] Comment enregistrer des images en utilisant Active Storage au format assistant
[IOS] Que faire lorsque l'image est remplie d'une seule couleur
[Rails] À propos de l'erreur selon laquelle l'image n'est pas affichée dans l'environnement de production
[Docker] Comment créer lorsque le code source est monté en liaison sur le conteneur
Comment résoudre la construction de l'environnement local de Ruby on Rails (MAC)!
[Rails] Comment résoudre le décalage temporel de created_at après la méthode de sauvegarde
[Rails] Que faire lorsque l'image Refile n'est pas affichée lors de l'écriture du traitement au moment de l'erreur de routage
Comment résoudre l'erreur'ActionView :: Template :: Error (L'actif "application.css" n'est pas présent dans le pipeline d'actifs. '"Lors de la précompilation d'actifs Rails
Que faire à propos de "Un serveur est déjà en cours d'exécution ..." qui s'est produit sans désactiver le serveur de rails dans le terminal