2013-02-10 60 views
0

我正在進行部分緩存,它工作得很好。在rails中緩存DOM更改

但是,如果我更改高速緩存塊內的DOM,這些更改將不會被緩存。有沒有辦法來包含這些變化?

這是我到目前爲止有:

<% 
cache(@contact.hash_key) do 
    %><div id="<%[email protected]_key%>"></div><% 
end 
%> 

<script> 
    //use ajax to prepend new messages. 
    $(document).ready(function(){ 
     $.get("/messages?cid=<%[email protected]_key%>", function(data) { 
      $("#<%[email protected]_key%>").prepend(data); 
     }); 
    }); 
</script> 

UPDATE

好了,所以我想嘗試緩存結果進入用相同的緩存鍵的DOM之前。這樣,當緩存塊被渲染時,新數據包含在該密鑰中。

但我不確定正確的方式來構造這個。

回答

0

完成!

因此,對於任何想要做同樣的事情的人來說,這裏是一個關於如何做到這一點的簡要大綱。您可能需要對此解決方案進行更改或調整以適應您的需求。

這隻有在您使用緩存鍵時纔有效。在我的例子中,我有兩種類型。一個contact.hash_keymessage.hash_key

所有消息緩存保持父接觸緩存中。所以本質上:

<div id='contact-hash'> 
    <div id='message-hash-1'> 
    <div id='message-hash-2'> 
    <div id='message-hash-3'> 

首先,我們需要遍歷消息,看看它們是否被緩存。如果他們是那麼你可以只渲染緩存的副本。您可以通過使用Rails.cache.read方法做到這一點:

messages.each do |message| 
    cache = Rails.cache.read 'views/'+message.hash_key 
    if cache.nil? == false 
     %><%= cache.html_safe %><% 
    end 
end 

所以,現在我們已經被加載從緩存中這就是消息的名單。那麼新消息呢?讓我們通過ajax加載它們,這樣用戶就不會等待無聊的頁面加載。

你會發現在我的問題上面我在我的AJAX調用中詢問"/messages?cid=<%[email protected]_key%>"。這是調用messages controller並呈現index view

在我們想要將渲染的視圖加載到DOM之前,我們首先想到將它寫入緩存,但是我們將使用相同的message.hash_key來讀取它。

所以在你看來:

<% 
cache(message[:hash_key]) do 
%> 
    <div class='message'> 
     This is a new message from the server. 
    </div> 
<% 
end 
%> 

如果在某些情況下,這並不工作(天知道那裏有這麼多的應用程序排列在那裏),你也可以在控制器中使用Rails.cache.write 'foo', 'bar'而不是在其高速緩存的視圖級別。

而你有它。現在,您可以將新的hash_key添加到列表中,然後將視圖呈現回DOM,作爲AJAX調用的結果。

現在,您可以在列表中使用新的hash_key循環它,並將其作爲緩存副本。

這可能是也可能不是最優雅的解決方案。如果有人想簡化或給出任何建議,所以我可以改進它,將不勝感激。