2

我在非常简单的 Ramaze 项目中遇到了问题。我的项目与从“ramaze create mywebsite”生成的原型项目相同,除了我使用的是 Haml 模板(我在 controller/init.rb 中设置了“engine :Haml”)。

以下是重现问题的步骤:

  1. 启动开发服务器。我正在使用薄。
  2. 访问应用程序中的一项操作。到目前为止,我有“/”、“/about”和“/signup”。该操作的模板将正确呈现。
  3. 访问不同的操作。这次将返回为第一个操作呈现的完全相同的内容。

只有启动开发服务器后的第一个请求才会正确呈现。

我只认为它与 Haml 有关,因为在切换回 Ramaze 的默认引擎后,一切正常。我所有的宝石都是最新的。

有任何想法吗?

谢谢!

4

4 回答 4

3

通过恢复对 Ramaze 处理 Haml 视图的方式的一些假定改进来修复它。即使 @content 变量发生变化,它也会缓存布局的结果。我还添加了一个规范,因此将来不会发生这种情况:spec/ramaze/view/haml.rb

于 2010-02-02T09:54:40.253 回答
2

您可以尝试在 Ramaze 上将 haml.rb 恢复到提交 45db6fe0696dfac7deeebba42c62c6bcca8bab10 之前的状态吗?这修复了我的应用程序上的错误。

我认为这个错误是由这个引起的:

导致错误的新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这里绑定到@content存储的 action.instance 。

这意味着每次我们使用相同的布局(因此也使用相同的缓存键)渲染页面时,我们使用的是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

一周前在#ramaze 频道中报告了该错误。似乎充耳不闻,因为它尚未修复。

于 2010-01-18T16:32:37.877 回答