代码之家  ›  专栏  ›  技术社区  ›  alexebird

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

  •  2
  • alexebird  · 技术社区  · 14 年前

    我的一个简单的拉玛兹项目遇到了问题。我的项目与“ramaze create mywebsite”生成的原型项目相同,只是我使用的是haml模板(我在controller/init.rb中设置了“engine:haml”)。

    以下是重现问题的步骤:

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

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

    我认为这只和哈姆有关,因为在切换回Ramaze的默认引擎后,一切都会正常工作。我所有的宝石都是最新的。

    有什么想法吗?

    谢谢您!

    4 回复  |  直到 14 年前
        1
  •  3
  •   manveru    14 年前

    修复了它,恢复了Ramaze处理Haml视图的方式。它将缓存布局的结果,即使@content变量已更改。 我还添加了一个规范,这样以后就不会发生这种情况: spec/ramaze/view/haml.rb

        2
  •  2
  •   hrnt    14 年前

    你能试着把haml.rb恢复到在Ramaze上提交45db6fe0696dfac7deebba42c62c6bca8bab10之前的状态吗?修复了我应用程序上的错误。

    我假设错误是由以下原因引起的:

    导致错误的新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的校验和。问题是 渲染程序 在此绑定到action.instance,其中 @content 存储。

    这意味着每次我们使用相同的布局(从而使用相同的缓存键)呈现页面时,我们都使用相同的 action.instance 我们在呈现第一页时使用。结果是,我们总是得到相同的布局,并用相同的实例变量填充。

    我认为做那个补丁的人假设人们使用局部变量( content )在其布局中而不是实例变量中( @内容 )确实,如果 内容 使用而不是 @内容 在布局中,错误似乎消失了。

        3
  •  1
  •   alexebird    14 年前

    找到解决办法!这个问题与固有的::视图缓存系统有关。通过禁用视图缓存:

    Innate::View.options.cache = false
    

    问题已解决。显然这并不理想,但我暂时不想缓存视图和使用HAML。我花了一段时间试图弄清楚Intential::View中的错误所在,但没有发现任何问题。

        4
  •  -1
  •   Boiled Waffel    14 年前

    一周前,Ramaze频道报道了这个漏洞。对聋子来说,这似乎是因为它还没有被修复。

    推荐文章