[RUBY] Traitement lorsqu'un ID qui n'existe pas dans la base de données est entré dans l'URL

Histoire principale

Les données enregistrées dans la base de données reçoivent l'ID de la clé primaire, mais si ces données sont supprimées, cet ID n'existera plus. Il y a un «: id» dans l'URL de la page de détail du produit et de la page de détail du membre, et en changeant ce numéro, la page de détail correspondant à l'ID de ce numéro sera affichée, mais si un ID qui n'existe pas est entré Si

ActiveRecord::RecordNotFound
Couldn't trouver le nom du modèle avec'id'=Numéro saisi

Erreur se produit.

Le processus à effectuer cette fois est "afficher si l'ID existe et rediriger s'il n'existe pas".

environnement

Ruby 2.5.7 Rails 5.2.4

Procédure de traitement

Cette fois, nous allons procéder en définissant une action dans application_controller et en définissant cette action comme befor_action dans chaque contrôleur que vous souhaitez rediriger. En ce qui concerne la situation, on suppose que le processus se déroule lorsque l'ID du produit est entré dans l'URL sur la page de détails du produit.

application_controller.rb


class ApplicationController < ActionController::Base

  def exist_item?
    unless Item.find_by(:id params[:id])
      redirect_to root_path
    end
  end

Utilisez l'instruction sauf pour effectuer le traitement à l'intérieur lorsque l'expression conditionnelle est «false». Dans ce cas, la méthode find_by est utilisée pour rechercher la valeur numérique saisie (params [: id]) à partir des ID d'élément et déterminer s'il faut ou non frapper, et s'il n'y a pas de succès (= false) ) Signifie que le processus interne redirect_to root_path est exécuté.

Ensuite, définissez ʻexist? Défini dans application_controller.rb sur before_action` dans le contrôleur du produit.

items_controller.rb


class ItemsController < ApplicationController
 
  #Vers l'URL:Spécifiez une action avec identifiant
  before_action :exist_item?, only[:show, :edit, :update, :destroy]
  ...

  def show
    ...
  end

  ...

end

Pour le moment, l'action spécifiée par l'option ʻonly: peut être uniquement: show et: editavec affichage, mais pour le moment, ajoutez aussi: update et: destroy. (Ce n'est pas nécessaire, mais si vous modifiez de force les paramètres du formulaire et que vous le soumettez, l'erreur au début sera affichée.) Cela effectuera une action (ʻexist_item? ) Qui vérifie que l'ID de l'élément entré existe avant chaque action.

Résumé

On s'attend à ce que la vitesse d'affichage, qui était un point faible avant la correction, soit grandement améliorée.

J'aimerais continuer à vérifier les commentaires que j'ai reçus de temps en temps!

Merci d'avoir lu jusqu'au bout!

L'article avant la correction est le suivant, mais il n'est pas recommandé.

Procédure de traitement (* non recommandé)

Cette fois, nous allons procéder en définissant une action dans application_controller et en définissant cette action comme befor_action dans chaque contrôleur que vous souhaitez rediriger. En ce qui concerne la situation, on suppose que le processus se déroule lorsque l'ID du produit est entré dans l'URL sur la page de détails du produit.

application_controller.rb


class ApplicationController < ActionController::Base

  def exist?
    Item.all.each do |item|
      if item.id == params[:id].to_i
        return
      end
    end
    redirect_to root_path
  end

end

Tout d'abord, utilisez l'instruction each pour obtenir toutes les informations sur le produit dans l'ordre à partir de la table des produits. Dans chacun d'eux, il est vérifié si «l'id» de l'élément est le même que la valeur numérique saisie pour chaque tour. (.To_i est utilisé car le nombre entré est reconnu comme un type de chaîne et doit être aligné avec le même type d'entier que ʻitem.id`.

item.id = 0
params[:id] = "0"
if item.id == params[:id] => false

Si l'ID d'élément et la valeur numérique saisie (params [: id]) correspondent dans chaque instruction, le traitement dans ʻif, returnest effectué. Lorsqu'unreturn est effectué, le programme l'ignore et termine l'action, de sorte que redirect_to root_pathn'est pas exécuté. Inversement, si chaque instruction se termine et que le nombre qui y est entré et que l'ID d'élément ne correspondent jamais, leredirect_to root_path` suivant est exécuté pour rediriger vers n'importe quelle page.

items_controller.rb


class ItemsController < ApplicationController
 
  #Vers l'URL:Spécifiez une action avec identifiant
  before_action :exist?, only[:show, :edit, :update, :destroy]
  ...

  def show
    ...
  end

  ...

end

Ensuite, définissez ʻexist? Défini dans application_controller.rb sur before_actiondans le contrôleur du produit. Pour le moment, l'action spécifiée par l'option ʻonly:peut être uniquement: show et: edit avec affichage, mais pour le moment, ajoutez aussi : update et: destroy. (Ce n'est pas nécessaire, mais si vous modifiez de force les paramètres du formulaire et que vous le soumettez, l'erreur au début sera affichée.) Cela effectuera une action (ʻexist? `) Qui vérifie que l'ID de l'élément saisi existe avant chaque action.

Faiblesses

Cette méthode prend plus de temps à traiter à mesure que le nombre d'enregistrements (le nombre de produits dans ce cas) augmente. S'il y a 1 000 produits, chaque déclaration sera répétée jusqu'à 1 000 fois, de sorte que l'affichage des pages de détails, etc. sera considérablement lourd.

Il devrait y avoir un autre bon moyen, donc je le mettrai à jour dès que je le trouverai ┏ ○ Je vous serais reconnaissant si vous pouviez me le faire savoir dans les commentaires!

Recommended Posts

Traitement lorsqu'un ID qui n'existe pas dans la base de données est entré dans l'URL
Que faire lorsque la "relation" hibernate_sequence "n'existe pas" dans la colonne ID de PostgreSQL + JPA
Lorsque le projet n'est pas affiché dans eclipse
Un hachage actif qui peut être traité comme des données même s'il n'est pas dans la base de données
Instructions pour l'écriture de traitement lorsque des valeurs existent / n'existent pas dans Java Facultatif
La rétention peut ne pas être disponible pour les annotations SOURCE lors de l'exécution du traitement des annotations dans l'EDI
[Gradle] L'histoire selon laquelle le fichier de classe n'existait pas dans le fichier jar
Comment afficher la valeur lorsqu'il y a un tableau dans le tableau
Comment résoudre le problème que le bean n'est pas traité correctement lorsqu'il est imbriqué dans Spring Batch
[Rails] À propos de l'erreur selon laquelle l'image n'est pas affichée dans l'environnement de production
Ignorer les paramètres qui n'existent pas dans le modèle avec ObjectMapper # readValue
Je souhaite afficher un message d'erreur lors de l'inscription dans la base de données
Continuation ・ Hash actif qui peut être traité comme des données même s'il n'est pas dans la base de données ~ Affichage
Si la version JDK est correcte dans Eclipse mais qu'une erreur se produit ou que le compilateur ne fonctionne pas correctement
Dans WSL2, quand j'ai fait `docker-compose up`, j'ai eu une erreur disant que le fichier sh n'a pas été trouvé.
[JPA] Comparez table1 et table2 pour obtenir et mettre à jour des données qui n'existent pas dans la table2.
Méthode de réglage qui ne change pas la taille même si le CSS est changé
Comment définir quand "Le constructeur Empty () n'est pas visible" se produit dans junit
Traitement d'échappement lors de la création d'une URL dans Ruby
Concernant le mappage de la clé de hachage et de la valeur
La séquence d'échappement (\) ne fonctionne-t-elle pas? (pour Mac)
La clé publique pour jenkins-2.249.1-1.1.noarch.rpm n'est pas installée
Instructions pour l'écriture de traitement lorsque des valeurs existent / n'existent pas dans Java Facultatif
Le problème que le JDK défini dans JAVA_HOME n'apparaît pas même si java -version est exécuté à l'invite de commande
Ne reconnaît pas la bibliothèque lors de l'implémentation de jcaptcha
Ebean.update () n'est pas exécuté dans le modèle hérité.
[Railways] Railways ne fonctionne pas lorsque la racine du projet RubyMine est différente du répertoire racine Rails.
[Android Studio] À propos du fait que la vue de conception n'est pas affichée lors de l'utilisation de TextClock
L'histoire lorsque le conteneur ne démarre pas avec docker-compose up et qu'une erreur se produit
Dans la boîte de dialogue d'avertissement lors du démarrage de l'applet, la vérification de "Ne pas afficher de la prochaine fois" ne fonctionne pas
Personnalisez l'affichage lorsqu'une erreur telle que 404 Not Found se produit dans Spring Boot
[Remarque] Lorsque la vitesse d'accès à la page n'augmente pas
PATH ne passe pas ... La cause est le code du caractère
Définissez l'URL racine lors du démarrage de Tomcat avec intelliJ
Code qui affiche uniquement la caméra intégrée dans le traitement
[Erreur] L'application ne s'affiche pas dans l'environnement de production
Une valeur nulle est entrée lors de l'affectation à un tableau
L'histoire que .java est également construite dans Unity 2018
Lorsqu'un point d'arrêt est défini dans IntelliJ IDEA mais qu'il ne s'arrête pas au débogage [Gradle]
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é
Lors de la réécriture du CMD de l'image docker de Pod dans le manifeste de k8s, n'utilisez pas la commande
[Rails] Comment enregistrer temporairement l'URL de demande d'un utilisateur qui n'est pas connecté et revenir à cette URL après la connexion
Java learning_Behavior lorsqu'il y a un champ avec le même nom et une méthode avec le même nom dans deux classes dans une relation d'héritage