2

非常に単純なRamazeプロジェクトで問題が発生しました。私のプロジェクトは、Hamlテンプレートを使用していることを除いて、「ramaze create mywebsite」から生成されたプロトタイププロジェクトと同じです(controller / init.rbで「engine:Haml」を設定します)。

問題を再現する手順は次のとおりです。

  1. 開発サーバーを起動します。私はThinを使用しています。
  2. アプリのアクションの1つにアクセスします。これまでのところ、「/」、「/ about」、および「/signup」があります。アクションのテンプレートは正しくレンダリングされます。
  3. 別のアクションにアクセスしてください。今回は、最初のアクションでレンダリングされたものとまったく同じものが返されます。

開発サーバーを起動した後の最初のリクエストのみが正しくレンダリングされます。

Ramazeのデフォルトのエンジンに切り替えた後は、すべてが正常に機能するため、Hamlと関係があると思います。私の宝石はすべて最新です。

何か案は?

ありがとうございました!

4

4 に答える 4

3

RamazeがHamlビューを処理する方法に想定されるいくつかの改善を元に戻すことで、これを修正しました。@content変数が変更された場合でも、レイアウトの結果がキャッシュされます。また、これが将来発生しないように仕様を追加しました:sp​​ec / ramaze / view / haml.rb

于 2010-02-02T09:54:40.253 に答える
2

Ramazeで45db6fe0696dfac7deeebba42c62c6bcca8bab10をコミットする前の状態にhaml.rbを戻してみることができますか?これで私のアプリのバグが修正されました。

バグの原因は次のとおりです。

バグの原因となる新しいhaml.rb:

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

の戻り値render_procはキャッシュされます。使用されるキーは、AFAIK、未処理のレイアウトHamlのチェックサムです。問題は、ここでが格納されrender_procているaction.instanceにバインドされることです。@content

これは、同じレイアウト(したがって同じキャッシュキー)を使用してページをレンダリングするたびにaction.instance、最初のページをレンダリングするときに使用したものと同じものを使用していることを意味します。その結果、常に同じインスタンス変数で満たされた同じレイアウトが得られます。

そのパッチを適用した人はcontent、インスタンス変数()ではなくローカル変数()をレイアウトに使用していると想定していたと思います@content。確かに、レイアウトcontentの代わりにを使用すると@content、バグは消えたように見えます。

于 2010-01-19T11:07:03.013 に答える
1

回避策を見つけました!この問題は、Innate::Viewキャッシングシステムに関係しています。ビューキャッシュを無効にすることにより:

Innate::View.options.cache = false

問題は修正されました。明らかにこれは理想的ではありませんが、ビューをキャッシュせず、当面はHamlを使用したいと思います。Innate :: Viewの何が問題なのかを理解するためにしばらく時間を費やしましたが、何も見つかりませんでした。

于 2010-01-17T23:30:04.543 に答える
-1

そのバグは1週間前に#ramazeチャンネルで報告されました。まだ修正されていないので耳が聞こえないようです。

于 2010-01-18T16:32:37.877 に答える