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".
Ruby 2.5.7 Rails 5.2.4
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.
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é.
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'un
return 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, le
redirect_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.
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