2010-01-14 73 views
2

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

下面是重现该问题的步骤:

  1. 启动开发服务器。我正在使用Thin。
  2. 访问应用程序中的某个操作。到目前为止,我有'/','/ about'和'/注册'。该操作的模板将被正确渲染。
  3. 访问其他操作。这次,返回第一个动作的完全相同的东西。

才刚刚开始开发服务器后的第一个请求会被正确地呈现。

我只是觉得它有一些事情,因为切换回用于Ramaze的默认引擎后做Haml的,一切正常,因为它应该。我所有的宝石都是最新的。

任何想法?

谢谢!

+0

您可以将您的完整项目源代码提交考试吗?要么做一个github项目,要么使用http://gist.github.com。 – Pistos 2010-01-15 01:18:30

+0

这是一个示例项目,其中存在所描述的问题。 http://github.com/alexebird/nohaml/ 此外,我发现问题只发生在布局内呈现模板时。通过注释掉controller/init.rb中的“layout:default”行,问题就消失了。 – alexebird 2010-01-17 02:53:47

回答

3

通过恢复到Ramaze处理Haml的意见的方式应该有些改进固定它。即使@content变量发生变化,它也会缓存布局的结果。 我还添加了一个规格,以便将来不会发生这种情况:spec/ramaze/view/haml.rb

1

想出了一个解决办法!这个问题与Innate :: View缓存系统有关。通过禁用视图缓存:

Innate::View.options.cache = false 

问题已修复。显然这并不理想,但我宁愿不缓存视图并暂时使用Haml。我花了一些时间试图找出Innate :: View中出了什么问题,但我没有找到任何东西。

-1

这个bug被报道#ramaze频道一周前..向聋人看来,因为它尚未固定的耳朵。

2

可以尝试还原haml.rb到它是在你的Ramaze提交45db6fe0696dfac7deeebba42c62c6bcca8bab10之前的状态?这修正了我的应用程序的错误。

我认为这个bug是由这个原因引起:

新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,则该错误似乎消失。

+0

感谢您的回复。恢复到45db6fe ...打破了我的应用程序。我使用的是Flash帮助器,它现在会抛出一个异常,说它找不到Flash方法。如果我知道我对绑定的了解,那么H​​aml渲染过程就会绑定到Object.new,这当然不包含flash帮助器。 使用来自2dd1012b4a396fcf18b983cfa6a36cc30fe1c903的haml.rb适合我。 – alexebird 2010-01-20 18:54:21

+0

我已经注意到使用内容(local var)而不是@content并不能完全解决缓存问题。没有太多的研究,看起来好像模板在布局中正确显示,模板本身并没有被更新。 – alexebird 2010-01-20 20:46:01

+0

是的,我原来的帖子有点令人困惑:工作haml.rb和提交45db6之前一样。因此,包装起来,工作haml.rb是在2dd1012 :) – hrnt 2010-01-20 21:29:25

相关问题