2010-01-14 81 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

相關問題