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 に答える