Hinweis Dies begann ursprünglich mit einer Frage zu 404-Fehlern, aber jetzt ist es eine Frage, warum der Patch, den ich angewendet habe, einen Unterschied machen würde.
Wie erhalten Sie eine zwischengespeicherte Aktion zum Zurückgeben eines 404 für alle Anforderungen, die eine ActiveRecord :: RecordNotFound-Ausnahme auslösen, nicht nur die erste Anforderung?
Wenn Sie beispielsweise ein leeres Rails-Projekt starten, fügen Sie ein Produktmodell und einen Controller hinzu, richten Sie Ihre Datenbank.yml ein, richten Sie das Cachebackend in production.rb ein, rake db: migrieren, starten Sie dann in der Produktion und drücken Sie die Site für ein nicht vorhandenes Objekt, z Ссылка
%Vor%Beim ersten Aufruf der Seite wird die 404-Seite erwartungsgemäß zurückgegeben. Jeder nachfolgende Treffer für diese URL gibt jedoch eine leere Seite mit 200 OK zurück. Wie bekommst du jedes Mal 404 zurück?
Hier sind die CURL-Anfragen, gefolgt von den Logs
%Vor%Die zweite Antwort ist eindeutig falsch.
Hier ist eine Kopie des Protokolls für die 2 Anfragen:
%Vor%Wenn Sie die zwischengespeicherte Aktion aus dem Cache ziehen, enthält sie tatsächlich eine Art leeren Müll.
%Vor%Was mache ich hier falsch?
Bearbeiten
Ich habe bestätigt, dass Rails 2.1.2 und 2.2.2 dieses Verhalten nicht zeigen, aber 2.3.2. (d. h. die älteren Versionen speichern keine leere Antwort in den Cache und werfen tatsächlich einen 404 für die nachfolgenden Anfragen)
Ich habe Probleme beim Testen von Edge-Rails, da das Laden den folgenden Fehler beim Starten des Servers verursacht: foobar / vendor / rails / activesupport / lib / active_support / dependencies.rb: 440: in 'load_missing_constant': nicht initialisierte Konstante ActionController :: Failsafe (NameError)
Ich habe gegen den aktuellen Leiter des 2-3-stabilen Zweiges, 375e8976e3, getestet und es zeigt auch dieses Verhalten.
Bearbeiten Sie # 2 Ich versuchte herauszufinden, ob die Änderung in der Rails-Codebasis eingetreten ist, um festzustellen, ob sie beabsichtigt war. Es scheint, dass diese scheinbar harmlose Verpflichtung ist, wo der Fehler beginnt.
Hier sind die Details der Halbierung, wobei 404 das gewünschte Verhalten bezeichnet, wobei 200 unerwünscht ist.
%Vor%Hier ist ein Patch, der die Änderung umkehrt, was das Problem behebt, wenn es auf das Tag v2.3.2.1, d. h. dc88847e5ce392eed210b97525c14fca55852867, angewendet wird. Ich bin jedoch nicht schlau genug zu ergründen, warum diese scheinbar kleine Veränderung tatsächlich einen Unterschied machen würde! Vielleicht könnte jemand, der schlauer ist als ich, etwas über die Situation sagen?
%Vor%Bearbeiten Sie # 3 Der Patch scheint auch den zugehörigen Fehler zu beheben, der oben dargestellt wurde, wobei die Meldung "Completed in XYms (DB: Z) | 404 nicht gefunden [ Ссылка "erschien nicht im Protokoll.
Bearbeiten Sie # 4 Der obige Patch hat andere Dinge in ActionPack zerstört, also habe ich nachgesehen und einen Fix für das Problem generiert, das keinen Kollateralschaden verursacht. Der Patch und alle weiteren Updates werden im Leuchtturm von Rails
bereitgestellt Es scheint, dass include(X, Y, Z)
tatsächlich in einer anderen Reihenfolge als include X; include Y; include Z
arbeitet.
Im Folgenden habe ich den C-Code eingefügt, der die Modul # include-Methode in Ruby 1.8.6 implementiert.
%Vor% Auch wenn Sie mit Rubys C-Interna nicht vertraut sind, ist es ziemlich klar, dass diese Funktion eine for-Schleife hat, die nach oben iteriert, um zu überprüfen, ob der Typ aller Argumente T_MODULE ist, und dann eine while-Schleife verwendet, die nach unten iteriert die Module - so würden die Module in include(X, Y, Z)
tatsächlich in der Reihenfolge Z, Y, X
enthalten sein. Ich habe nicht alle fraglichen Rails-Module durchgegangen, aber ich stelle mir vor, dass es etwas Ordnungs-abhängiges gibt, das anfing zu versagen, sobald die Einschlussreihenfolge umgeschaltet wurde.
Tags und Links ruby ruby-on-rails