2 Stimmen

Ramaze's Haml-Engine liefert jedes Mal die gleiche Vorlage

Ich bin bei meinem sehr einfachen Ramaze-Projekt auf ein Problem gestoßen. Mein Projekt ist identisch mit dem Prototyp-Projekt, das aus "ramaze create mywebsite" generiert wird, außer dass ich Haml-Vorlagen verwende (ich setze "engine :Haml" in controller/init.rb).

Hier sind die Schritte, um das Problem zu reproduzieren:

  1. Starten Sie den Entwicklungsserver. Ich verwende Thin.
  2. Besuchen Sie eine der Aktionen in der App. Bislang habe ich '/', '/über' und '/anmelden'. Die Vorlage für die Aktion wird richtig gerendert werden.
  3. Besuchen Sie eine andere Aktion. Diesmal wird genau das Gleiche zurückgegeben, was bei der ersten Aktion gerendert wurde.

Nur die erste Anfrage nach dem Start des Dev-Servers wird korrekt gerendert.

Ich glaube nur, dass es etwas mit Haml zu tun hat, denn nachdem ich wieder zur Standard-Engine für Ramaze gewechselt habe, funktioniert alles wie es sollte. Alle meine Edelsteine sind auf dem neuesten Stand.

Irgendwelche Ideen?

Ich danke Ihnen!

3voto

manveru Punkte 2600

Das Problem wurde behoben, indem einige vermeintliche Verbesserungen an der Art und Weise, wie Ramaze mit Haml-Ansichten umgeht, rückgängig gemacht wurden. Es würde das Ergebnis des Layouts zwischenspeichern, obwohl sich die @content-Variable geändert hat. Ich habe auch eine Spezifikation hinzugefügt, damit dies in Zukunft nicht mehr passieren kann: spec/ramaze/view/haml.rb

2voto

hrnt Punkte 9582

Können Sie versuchen, haml.rb in den Zustand vor Commit 45db6fe0696dfac7deeebba42c62c6bcca8bab10 auf Ihrem Ramaze zurückzusetzen? Das hat den Fehler in meiner Anwendung behoben.

Ich nehme an, dass der Fehler hierdurch verursacht wird:

Die neue haml.rb verursacht den Fehler:

haml = View.compile(string) do |s|
  ::Haml::Engine.new(s,options).render_proc(action.instance,*action.variables.keys)
end

Der Rückgabewert von render_proc zwischengespeichert wird. Der verwendete Schlüssel ist, AFAIK, die Prüfsumme des unbearbeiteten Layouts Haml. Das Problem ist, dass render_proc bindet hier an action.instance, wo @content gespeichert ist.

Das bedeutet, dass wir jedes Mal, wenn wir eine Seite mit demselben Layout (und damit demselben Cache-Schlüssel) rendern, denselben action.instance die wir beim Rendern der ersten Seite verwendet haben. Das Ergebnis ist, dass wir immer das gleiche Layout mit den gleichen Instanzvariablen erhalten.

Ich glaube, die Person, die den Patch erstellt hat, ging davon aus, dass die Leute lokale Variablen verwenden ( content ) in ihrem Layout anstelle von Instanzvariablen ( @content ). In der Tat, wenn content verwendet wird, statt @content im Layout, scheint der Fehler zu verschwinden.

1voto

alexebird Punkte 63

Ich habe einen Ausweg gefunden! Das Problem hängt mit dem Innate::View Caching System zusammen. Durch die Deaktivierung des View Caching:

Innate::View.options.cache = false

das Problem ist behoben. Offensichtlich ist dies nicht ideal, aber ich würde lieber nicht cache Ansichten und verwenden Haml für die Zeit zu sein. Ich habe einige Zeit damit verbracht, herauszufinden, was in Innate::View falsch war, aber ich habe nichts gefunden.

-1voto

Boiled Waffel Punkte 1

Dieser Fehler wurde vor einer Woche im #ramaze-Kanal gemeldet und stieß anscheinend auf taube Ohren, da er noch nicht behoben wurde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X