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 %>
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? –
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? –
@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