2013-02-10 4 views
0

정말 잘 작동하는 부분 캐싱을 수행하고 있습니다.레일에서 DOM 변경 캐싱

그러나 캐시 블록 내에서 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를 : 여기에

는 내가 지금까지 가지고있는 것입니다. 그런 식으로 캐시 블록이 렌더링 될 때 새로운 데이터가 해당 키에 포함됩니다.

하지만 구조적으로 올바른 방법이 확실하지 않습니다.

답변

0

완료!

여기에서 동일한 작업을 수행하려는 사람은이를 수행하는 방법에 대한 간단한 개요를 제공합니다. 이 솔루션을 직접 변경하거나 조정해야 할 수도 있습니다.

캐시 키를 사용하는 경우에만 작동합니다. 내 경우에는 2 가지 유형이 있습니다. A 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에로드하기 전에 우리는 먼저 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를 사용하여 반복 할 수 있으며 캐시 된 사본으로 나타납니다.

이것은 가장 훌륭한 해결책 일 수도 있고 그렇지 않을 수도 있습니다. 누군가가 그것을 간소화하거나 그것에 대한 조언을 해주기를 원한다면 그것을 향상시킬 수 있으면 좋을 것입니다.