1

Yetkilendirme için pundit gem kullanarak 4 app raylar var. Aşağıdaki kod gibi önbelleğe alma işleminde Rusça-bebek parçası yaparsam, yetkilendirme için kullanılan koşullu deyim de önbelleğe alınır, bu da iyi değildir çünkü düzenleme/silme düğmeleri yalnızca post.user için kullanılabilir olmalıdır.raylar parça önbellekleme bazı parçalarını dışarı bırakarak

Bu işten kurtulmanın iyi yolu nedir? Önbelleği daha küçük parçalara ayırmalı mıyım yoksa önbelleklemenin bazı bölümlerini hariç tutmanın bir yolu var mı? Bu durumda raylar sözleşmesi nedir?

index.html.erb

<% cache ["posts-index", @posts.map(&:id), @posts.map(&:updated_at).max, @posts.map {|post| post.user.profile.updated_at}.max] do %> 
    <%= render @posts %> 
<% end %> 

_post.html.erb

<% cache ['post', post, post.user.profile ] do %> 

    <div class="row> 
    <div class="col-md-2"> 
     <%= link_to user_path(post.user) do %> 
     <%= image_tag post.user.avatar.url(:base_thumb), class: 'post-avatar' %> 
     <% end %> 
    </div> 

    <div class="col-md-8"> 
     <span class="post-user-name"><%= post.user.full_name %></span> 
     <span class="post-updated"><%= local_time_ago(post.updated_at) %></span> 
     <div class="post-body"> 
     <%= post.body %> 
     </div> 

    <div class="col-md-2" style="text-align:right;"> 

     <!--############### THIS IS THE PART THAT SHOULD NOT BE CACHED #############--> 

     <% if policy(post).edit? && policy(post).delete? %> 
     <li class="dropdown"> 
      <ul class = "dropdown-menu dropdown-menu-right"> 
      <li> 
       <%= link_to "Edit Post", edit_post_path(post), remote: true, type: "button", 'data-toggle' => "modal", 'data-target' => "#updatepost_#{post.id}" %> 
      </li> 
      <li> 
       <a href="#" data-toggle="modal" role="button" data-target="#deletepost_<%= post.id %>">Delete Post</a> 
      </li> 
      </ul> 
     </li> 
     <% end %> 

     <!--########################## UNTIL HERE ############################--> 

    </div> 
    </div> 

    <div class = "row comment-top-row" style="padding-bottom:10px;"> 
    <div class="col-md-12 post-comment-form"> 
     <%= render partial: 'posts/post_comments/post_comment_form', locals: { post: post } %> 
    </div> 
    </div> 

    <div class = "row"> 
    <div class="col-md-12 post-comment-insert-<%= post.id%>"> 
     <%= render partial: 'posts/post_comments/post_comment', collection: post.post_comments.ordered.included, as: :post_comment, locals: {post: post} %> 
    </div> 
    </div> 

    <% if policy(post).edit? %> 
    <div class="modal fade updatepost" id="updatepost_<%= post.id %>" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> 
     <!-- FORM GETS RENDERED HERE VIA JS --> 
    </div> 
    <% end %> 

    <% if policy(post).delete? %> 
    <div class="modal fade" id="deletepost_<%= post.id %>" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> 
     ...... 
    </div> 
    <% end %> 

<% end %> 

cevap

1

Rus Doll Caching hiçbir kompleks seçenekler veya parçasının bir kısmını dışlamak için kongre var, basit ama önbelleğe alma için kullanışlı bir yoludur ondan. Bunun üstünde, önbellek stratejileri ile daha ilgili. Bu kullanıcı için iki durum vardır:

  1. Tek tek yeniden düzenleyin ve parçaları önbelleğe almayın. Çünkü daha karmaşık ve Rus Doll Caching'in avantajlarını kullanmıyor. Bu kadar da sürdürülemez.

index.html.erb

<% # pull out cache %> 
<%= render @posts %> 

_post.html.erb

<% cache post %> 
    <%= # first part %> 
<% end %> 

<% # without cache %> 
<%= # user specific part %> 

<% cache post %> 
    <%= # third part %> 
<% end %> 
  1. Tercih yolu: olarak current_user ekle İşte bir örnek cache_key'un bir parçası olarak, yaklaşık olarak kullanıcılarınız kadar parça parça önbelleğe sahip olacağınız ve parçanın veya kullanıcının parmak izini değiştirdiğinde parçaları otomatik olarak geçersiz kılacağı anlamına gelir. Bu daha zarif ve sürdürülebilir. Bu ikinci yolu yeterince iyi

index.html.erb

<% cache ["posts-index", @posts.map(&:id), @posts.map(&:updated_at).max, @posts.map {|post| post.user.profile.updated_at}.max] do %> 
    <%= render @posts %> 
<% end %> 

_post.html.erb

<% cache ['post', post, post.user.profile, current_user ] do %> 
    <div class="row> 
    <div class="col-md-2"> 
     <%= link_to user_path(post.user) do %> 
     <%= image_tag post.user.avatar.url(:base_thumb), class: 'post-avatar' %> 
     <% end %> 
    </div> 

    <div class="col-md-8"> 
     <span class="post-user-name"><%= post.user.full_name %></span> 
     <span class="post-updated"><%= local_time_ago(post.updated_at) %></span> 
     <div class="post-body"> 
     <%= post.body %> 
     </div> 

    <div class="col-md-2" style="text-align:right;"> 
     <% if policy(post).edit? && policy(post).delete? %> 
     <li class="dropdown"> 
      <ul class = "dropdown-menu dropdown-menu-right"> 
      <li> 
       <%= link_to "Edit Post", edit_post_path(post), remote: true, type: "button", 'data-toggle' => "modal", 'data-target' => "#updatepost_#{post.id}" %> 
      </li> 
      <li> 
       <a href="#" data-toggle="modal" role="button" data-target="#deletepost_<%= post.id %>">Delete Post</a> 
      </li> 
      </ul> 
     </li> 
     <% end %> 
    </div> 
    </div> 

    <div class = "row comment-top-row" style="padding-bottom:10px;"> 
    <div class="col-md-12 post-comment-form"> 
     <%= render partial: 'posts/post_comments/post_comment_form', locals: { post: post } %> 
    </div> 
    </div> 

    <div class = "row"> 
    <div class="col-md-12 post-comment-insert-<%= post.id%>"> 
     <%= render partial: 'posts/post_comments/post_comment', collection: post.post_comments.ordered.included, as: :post_comment, locals: {post: post} %> 
    </div> 
    </div> 

    <% if policy(post).edit? %> 
    <div class="modal fade updatepost" id="updatepost_<%= post.id %>" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> 
     <!-- FORM GETS RENDERED HERE VIA JS --> 
    </div> 
    <% end %> 

    <% if policy(post).delete? %> 
    <div class="modal fade" id="deletepost_<%= post.id %>" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> 
     ...... 
    </div> 
    <% end %> 
<% end %> 
+0

abookyun edilir: İşte bir örnek? Önbelleğe alma işlemi amacını kaybetmez mi? Demek istediğim gibi, parça her kullanıcı için yeniden yazılacak. Ayrıca, uzun vadede çok fazla hafıza tüketmeyecek mi? –

+0

Pls ayrıca ön yorumumu okudu. 'Post_comment' 'post_comment_reply' 'post_comment_reply' içerisine 'post_comment' içerdiğinden bahsetmeyi unuttum. Bunlar ayrıca sadece "current_user" tarafından düzenlenebilir olmalı, bu yüzden bazı bölümlerin sadece "current_user" ile görülebilir. Bunları değiştirmek zorunda mıyım yoksa 'dokunma' bununla ilgilenir mi? –

+0

@SzilardMagyar IMHO: Dediğim gibi, bu bir strateji meselesidir, sadece iç içe geçmiş gönderi ve yorum sorgusu gibi yoğun istekleri kaydetme fırsatı varsa, bunun yeterince iyi olduğunu düşünüyorum, aksine, şablon sık sık değişiyorsa, başka bir şablon önbellekleme yapısına ihtiyacınız var . Uygulama hızınızı nasıl etkileyeceğini öğrenmek için bu makaleyi okuyabilirsiniz https://signalvnoise.com/posts/3690-the-performance-impact-of-russian-doll-caching – abookyun