Ramaze的Haml引擎每次返回相同的模板

时间:2010-01-14 00:46:51

标签: ruby haml ramaze

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

以下是重现问题的步骤:

  1. 启动开发服务器。我正在使用Thin。
  2. 访问应用中的其中一个操作。到目前为止,我有'/','/ about'和'/ signup'。该动作的模板将正确呈现。
  3. 访问其他操作。这次将返回为第一个动作呈现的完全相同的内容。
  4. 启动开发服务器后,只有第一个请求才能正确呈现。

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

    有什么想法吗?

    谢谢!

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

您可以尝试将haml.rb恢复到您在Ramaze上提交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,则错误似乎消失了。

答案 2 :(得分:1)

找出解决方法!问题涉及Innate :: View缓存系统。通过禁用视图缓存:

Innate::View.options.cache = false

问题得到解决。显然这并不理想,但我宁愿不缓存视图并暂时使用Haml。我花了一些时间试图弄清楚Innate :: View出了什么问题,但我没找到任何东西。

答案 3 :(得分:-1)

一个星期前在#ramaze频道报道了这个错误......听起来似乎已经没有修复了。