0

我正在进行部分缓存,效果非常好。

但是,如果我更改缓存块内的 DOM,则不会缓存这些更改。有没有办法也包括这些变化?

这是我到目前为止所拥有的:

<%
cache(@contact.hash_key) do
    %><div id="<%=@contact.hash_key%>"></div><%
end
%>

<script>
    //use ajax to prepend new messages.
    $(document).ready(function(){
       $.get("/messages?cid=<%=@contact.hash_key%>", function(data) {
          $("#<%=@contact.hash_key%>").prepend(data);
       });
    });
</script>

更新

好的,所以我试图在结果进入具有相同缓存键的 DOM 之前尝试缓存结果。这样,当呈现缓存块时,新数据将包含在该键中。

但我不确定构建它的正确方法。

4

1 回答 1

0

完毕!

因此,对于任何想要做同样事情的人来说,这里有一个关于如何做的简要概述。您可能需要进行更改或调整此解决方案以适合您自己的解决方案。

这仅在您使用缓存键时才有效。在我的例子中,我有 2 种类型。一个contact.hash_key和一个message.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 加载这些,这样用户就不会等待无聊的页面加载。

您会在我上面的问题中注意到我"/messages?cid=<%=@contact.hash_key%>"在 AJAX 调用中进行了查询。这是调用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 添加到列表中,然后将视图作为 AJAX 调用的结果呈现回 DOM。

现在使用列表中的新 hash_key,您可以对其进行循环,它将作为缓存副本出现。

这可能是也可能不是最优雅的解决方案。如果有人想对其进行简化或提供任何建议,以便我对其进行改进,将不胜感激。

于 2013-02-10T21:47:54.327 回答