2012-05-24 27 views
9

Với ERB bạn có thể phân mảnh hồ sơ cá nhân bộ nhớ cache trong một cái nhìn danh sách như vậy:Rails fragment caching render mẫu lỏng

<% @items.each do |item| %> 
    <% cache item do %> 
    <%= item.name %> 
    <% end %> 
<% end %> 

Như vậy, lần thứ hai trong danh sách được xem, từng hạng mục render sẽ được nạp từ bộ nhớ cache. Có thể sử dụng cách tiếp cận tương tự này khi sử dụng các mẫu Liquid? Các mẫu có thể giống như thế:

{% for item in items %} 
    {{ item.name }} 
{% endfor %} 

và render với:

template = Liquid::Template.parse(template) 
template.render('items' => @items) 

Khi nó vòng qua các mục, tôi muốn để có thể phân mảnh bộ nhớ cache mỗi một. Bất kỳ con trỏ?

Trả lời

8

Bạn có thể định nghĩa các thẻ tùy chỉnh trong chất lỏng, ví dụ nếu bạn đặt này trong một initializer

class Cacher < Liquid::Block 
    def initialize(tag_name, markup, tokens) 
    super 
    @key= markup.to_s 
    end 

    def render(context) 
    Rails.cache.fetch(@key) do 
     super 
    end 
    end 
end 

Liquid::Template.register_tag('cache', Cacher) 

Sau đó, bạn có thể làm

{% cache "some_key" %} 
    ... 
{% endcache %} 

Hãy rất cẩn thận với cách bạn xây dựng bộ nhớ cache Chìa khóa. Tất nhiên, bạn muốn tránh các xung đột, nhưng bạn cũng có thể không muốn mọi người có thể đọc các khóa tùy ý từ kho lưu trữ memcache của bạn (mã này làm gì). Mức độ phù hợp của vấn đề này tùy thuộc vào người có quyền truy cập vào ứng dụng này trong ứng dụng của bạn. Một chiến lược sẽ là không gian tên phím bộ nhớ cache.

+0

+1 để lưu ý cẩn thận về việc đặt tên khóa. Rất quan trọng khi cho người thuê nhà (trong một ứng dụng nhiều người thuê) khả năng chỉnh sửa các mẫu Liquid. –

+0

Câu trả lời tuyệt vời !! Hoạt động tuyệt vời. Cảm ơn rất nhiều. – Ivangrx

+0

Rất tốt, cảm ơn –