[RUBY] Verarbeitung, wenn eine ID, die nicht in der Datenbank vorhanden ist, in die URL eingegeben wird

Hauptgeschichte

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".

Umgebung

Ruby 2.5.7 Rails 5.2.4

Verarbeitungsverfahren

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.

Zusammenfassung

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.

Verarbeitungsverfahren (* 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.

Schwächen

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

Verarbeitung, wenn eine ID, die nicht in der Datenbank vorhanden ist, in die URL eingegeben wird
Was tun, wenn "Relation" hibernate_sequence "nicht existiert" in der ID-Spalte von PostgreSQL + JPA
Wenn das Projekt nicht in Eclipse angezeigt wird
Ein aktiver Hash, der als Daten behandelt werden kann, auch wenn er nicht in der Datenbank enthalten ist
Richtlinien für die Schreibverarbeitung, wenn Werte in Java vorhanden sind / nicht vorhanden Optional
Für SOURCE-Annotationen ist möglicherweise keine Aufbewahrung verfügbar, wenn die Annotationsverarbeitung in der IDE ausgeführt wird
[Gradle] Die Geschichte, dass die Klassendatei nicht in der JAR-Datei vorhanden war
So geben Sie den Wert aus, wenn sich ein Array im Array befindet
So lösen Sie das Problem, dass die Bean beim Verschachteln in Spring Batch nicht ordnungsgemäß verarbeitet wird
[Schienen] Über den Fehler, dass das Bild nicht in der Produktionsumgebung angezeigt wird
Ignorieren Sie Parameter, die im Modell nicht vorhanden sind, mit ObjectMapper # readValue
Ich möchte bei der Registrierung in der Datenbank eine Fehlermeldung anzeigen
Fortsetzung ・ Aktiver Hash, der als Daten behandelt werden kann, auch wenn er nicht in der Datenbank enthalten ist ~ Anzeige
Wenn die JDK-Version in Eclipse korrekt ist, aber ein Fehler auftritt oder der Compiler nicht ordnungsgemäß funktioniert
In WSL2, als ich "Docker-Compose Up" machte, bekam ich eine Fehlermeldung, dass die sh-Datei nicht gefunden wurde.
[JPA] Vergleichen Sie Tabelle1 und Tabelle2, um Daten abzurufen und zu aktualisieren, die in Tabelle2 nicht vorhanden sind
Einstellungsmethode, die die Größe nicht ändert, auch wenn das CSS geändert wird
Festlegen, wann in junit "Der Konstruktor Empty () ist nicht sichtbar" auftritt
Escape-Verarbeitung beim Erstellen einer URL in Ruby
In Bezug auf die Zuordnung von Hash-Schlüssel und Wert
Funktioniert die Escape-Sequenz (\) nicht? (für Mac)
Der öffentliche Schlüssel für jenkins-2.249.1-1.1.noarch.rpm ist nicht installiert
Richtlinien für die Schreibverarbeitung, wenn Werte in Java vorhanden sind / nicht vorhanden Optional
Das in JAVA_HOME festgelegte JDK-Problem tritt auch dann nicht auf, wenn die Java-Version an der Eingabeaufforderung ausgeführt wird
Erkennt die Bibliothek bei der Implementierung von jcaptcha nicht
Ebean.update () wird im geerbten Modell nicht ausgeführt.
[Railways] Railways funktioniert nicht, wenn sich das RubyMine-Projektstammverzeichnis nicht im Rails-Stammverzeichnis befindet.
[Android Studio] Über die Tatsache, dass die Entwurfsansicht bei Verwendung von TextClock nicht angezeigt wird
Die Geschichte, wenn der Container nicht mit Docker-Compose gestartet wird und ein Fehler auftritt
Im Warndialog beim Starten des Applets funktioniert die Prüfung "Beim nächsten Mal nicht anzeigen" nicht
Passen Sie die Anzeige an, wenn im Spring Boot ein Fehler wie 404 Not Found auftritt
[Hinweis] Wenn die Seitenzugriffsgeschwindigkeit nicht erhöht wird
PATH geht nicht vorbei ... Die Ursache ist der Zeichencode
Legen Sie die Root-URL fest, wenn Sie Tomcat mit IntelliJ starten
Code, der nur die in der Verarbeitung integrierte Kamera anzeigt
[Fehler] Die App wird in der Produktionsumgebung nicht angezeigt
Beim Zuweisen zu einem Array wird ein Nullwert eingegeben
Die Geschichte, dass .java auch in Unity 2018 erstellt wurde
Wenn in IntelliJ IDEA ein Haltepunkt festgelegt ist, der jedoch beim Debuggen von [Gradle] nicht beendet wird
So lösen Sie das Problem, wenn der Wert nicht gesendet wird, wenn das Formular in Schienen deaktiviert und gesendet wird
Verwenden Sie keinen Befehl, wenn Sie die CMD des Docker-Images von Pod im Manifest von k8s neu schreiben
[Rails] So speichern Sie die Anforderungs-URL eines Benutzers, der nicht angemeldet ist, vorübergehend und kehren nach der Anmeldung zu dieser URL zurück
Java learning_Behavior, wenn ein Feld mit demselben Namen und eine Methode mit demselben Namen in zwei Klassen in einer Vererbungsbeziehung vorhanden sind