2013-01-19 42 views
0

我有一個視圖來顯示保存在數據庫中的資源的詳細信息。一些細節屬於資源模型本身,一些細節屬於相關模型。有些字段在Rails中的分段緩存中獲取舊值

在視圖中我使用片段緩存的細節。

當用戶按下視圖上的按鈕時,視圖的一部分被表單替換,因此用戶可以在不加載新頁面的情況下編輯細節。當表單打開時,緩存已過期(實際上,我已經檢查過)。當用戶提交表單(using :remote => true)時,表單將隱藏,並且使用jQuery重新加載原始內容並呈現部分內容。

到目前爲止,一切正常。使用<% cache ... do %><% end %>以內的代碼中的新值正確重新加載原始內容。

奇怪的是當我重新加載頁面時,一些新值已經消失。相反,會顯示一些舊的值(在上次提交後應該緩存的值)。更奇怪的是,即使它們與錯誤的值位於同一個新的緩存文件中,某些值也會被更新。

就我所見,相關模型中的值是正確的,而資源模型中的值是錯誤的(舊的)。我想知道它是否與sql緩存有關,但我不認爲這是事實,因爲我認爲在重新加載頁面時應該清空sql緩存。

如果我打開表單並再次提交,數據會更新,並且一切正常。這是來自上次提交的數據進入緩存。如果在提交之前更改表單中的數據,它仍然是包含在緩存文件中的上次提交的數據。因此,即使其他字段更新正確,似乎爲資源模型提交的數據也會延遲一次提交。

如果我在development.rb中關閉緩存,一切都按預期工作。所有數據每次更新。

順便說一下,我的服務器上有同樣的問題。

任何有線索的人?

回答

0

不知道這是否會有所幫助,但在過去的幾天裏,我在自己的網站上實現了基於緩存鍵的片段緩存方案,取得了一些成功。

我實現了我的所有車型get_cache_key功能

def get_cache_key(prefix=nil) 
    cache_key = [] 
    cache_key << prefix if prefix 
    cache_key << self 

    child_objects.in_sort_order.each do |child_object| 
     cache_key << child_object.get_cache_key 
    end 

    return cache_key.flatten 
    end 

在我的意見然後我用現在

<% cache(@home_page.get_cache_key('some_name_for_fragment')) do %> 
...Render View 
<% end %> 

的車型產生緩存鍵將無效如果父模型或任何緩存其子女改變了。

全文寫在這裏,在我的網站上。 Rails caching strategy using key-based approach

+0

除了不包括您的'簽名',請記住,當您鏈接到您自己的網站時,您必須透露它是您的網站。我在這裏爲您添加了必要的披露。 –

+0

感謝您的回覆!我現在還沒有時間(也沒有動力)去充分考慮這一點。由於緩存文件實際上被刪除,我認爲你的解決方案將無濟於事。所以我嘗試了其他的東西。我希望它能起作用! :-) –

0

好像數據在更新後不久就被緩存了一下。到目前爲止,我的解決方案是在資源更新後的兩分鐘內將視圖中的緩存刪除。該片段未被緩存,直到稍後有人更新頁面。這不是一個很好的解決方案,而每次查看頁面時都必須查詢頁面上的每個資源(30個資源)的更新時間。