Die in der Datenbank registrierten Daten erhalten die ID des Primärschlüssels. Wenn diese Daten jedoch gelöscht werden, ist diese ID nicht mehr vorhanden.
Die URL der Produktdetailseite und der Mitgliederdetailseite enthält eine : id
. Durch Ändern dieser Nummer wird die der ID dieser Nummer entsprechende Detailseite angezeigt. Wenn jedoch eine nicht vorhandene ID eingegeben wird Wenn
ActiveRecord::RecordNotFound
Couldn't Modellname mit finden'id'=Eingegebene Nummer
Fehler tritt auf.
Der diesmal auszuführende Vorgang lautet "Anzeigen, wenn die ID vorhanden ist, und Umleiten, wenn sie nicht vorhanden ist".
Ruby 2.5.7 Rails 5.2.4
Dieses Mal definieren wir eine Aktion in application_controller und setzen diese Aktion in jedem Controller, den Sie umleiten möchten, als vor_Aktion. In der Situation wird davon ausgegangen, dass der Prozess stattfindet, wenn die Produkt-ID in die URL auf der Produktdetailseite eingegeben wird.
application_controller.rb
class ApplicationController < ActionController::Base
def exist_item?
unless Item.find_by(:id params[:id])
redirect_to root_path
end
end
Verwenden Sie die if-Anweisung, um die Verarbeitung im Inneren auszuführen, wenn der bedingte Ausdruck "false" ist.
In diesem Fall wird die find_by-Methode verwendet, um den eingegebenen numerischen Wert (params [: id]
) aus den Item-IDs zu suchen und zu bestimmen, ob ein Treffer erzielt werden soll oder nicht und ob kein Treffer vorliegt (= false).
) Bedeutet, dass der interne Prozess redirect_to root_path
ausgeführt wird.
Setzen Sie als Nächstes das in application_controller.rb definierte exist?
Im Controller des Produkts auf before_action
.
items_controller.rb
class ItemsController < ApplicationController
#Zur URL:Geben Sie eine Aktion einschließlich ID an
before_action :exist_item?, only[:show, :edit, :update, :destroy]
...
def show
...
end
...
end
Zu diesem Zeitpunkt kann die durch die Option "nur:" angegebene Aktion nur ": show" oder ": edit" mit Anzeige sein, aber ": update" oder ": destroy" sollte vorerst hinzugefügt werden.
(Es ist nicht erforderlich, aber wenn Sie die Parameter im Formular zwangsweise ändern und abschicken, wird der Fehler am Anfang angezeigt.)
Dadurch wird eine Aktion ausgeführt (exist_item?
), Mit der überprüft wird, ob die ID des eingegebenen Elements vor jeder Aktion vorhanden ist.
Es wird erwartet, dass die Anzeigegeschwindigkeit, die vor der Korrektur ein schwacher Punkt war, erheblich verbessert wird.
Ich möchte die Kommentare, die ich von Zeit zu Zeit erhalten habe, weiterhin überprüfen!
Vielen Dank für das Lesen bis zum Ende!
Der Artikel vor der Korrektur lautet wie folgt, wird jedoch nicht empfohlen.
Dieses Mal definieren wir eine Aktion in application_controller und setzen diese Aktion in jedem Controller, den Sie umleiten möchten, als vor_Aktion. In der Situation wird davon ausgegangen, dass der Prozess stattfindet, wenn die Produkt-ID in die URL auf der Produktdetailseite eingegeben wird.
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
Verwenden Sie zunächst jede Anweisung, um alle Produktinformationen in der angegebenen Reihenfolge aus der Produkttabelle abzurufen.
In jedem wird überprüft, ob die "ID" des Elements mit dem eingegebenen numerischen Wert für jede Runde übereinstimmt.
(.To_i
wird verwendet, weil die eingegebene Nummer als Zeichenfolgentyp erkannt wird und mit demselben Ganzzahltyp wie item.id
ausgerichtet werden muss.
item.id = 0
params[:id] = "0"
if item.id == params[:id] => false
)
Wenn die Artikel-ID und der eingegebene numerische Wert (params [: id]
) in jeder Anweisung übereinstimmen, wird die Verarbeitung in if
und return
durchgeführt.
Wenn ein "return" gemacht wird, überspringt das Programm es und beendet die Aktion, so dass der "redirect_to root_path" nicht ausgeführt wird.
Wenn umgekehrt jede Anweisung endet und die darin eingegebene Nummer und die Element-ID nie übereinstimmen, wird der nachfolgende "redirect_to root_path" ausgeführt, um zu einer beliebigen Seite umzuleiten.
items_controller.rb
class ItemsController < ApplicationController
#Zur URL:Geben Sie eine Aktion einschließlich ID an
before_action :exist?, only[:show, :edit, :update, :destroy]
...
def show
...
end
...
end
Setzen Sie als Nächstes das in application_controller.rb definierte exist?
Im Controller des Produkts auf before_action
.
Zu diesem Zeitpunkt kann die durch die Option "nur:" angegebene Aktion nur ": show" oder ": edit" mit Anzeige sein, aber ": update" oder ": destroy" sollte vorerst hinzugefügt werden.
(Es ist nicht erforderlich, aber wenn Sie die Parameter im Formular zwangsweise ändern und abschicken, wird der Fehler am Anfang angezeigt.)
Dadurch wird eine Aktion ausgeführt ("vorhanden?"), Mit der überprüft wird, ob die ID des eingegebenen Elements vor jeder Aktion vorhanden ist.
Die Verarbeitung dieser Methode dauert länger, da die Anzahl der Datensätze (in diesem Fall die Anzahl der Produkte) zunimmt. Bei 1.000 Produkten wird jede Aussage bis zu 1.000 Mal wiederholt, sodass die Anzeige von Detailseiten usw. sehr umfangreich ist.
Es sollte einen anderen guten Weg geben, also werde ich ihn aktualisieren, sobald ich ihn finde ┏ ○ Ich würde mich freuen, wenn Sie mich in den Kommentaren wissen lassen könnten!
Recommended Posts