2012-05-24 8 views
9

Con ERB se puede fragmentar caché los registros individuales en una vista de lista de este modo:rieles fragmento de almacenamiento en caché rindió plantilla de líquido

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

Por lo tanto, la segunda vez que la lista se ve, cada elemento prestados serán cargados desde la memoria caché. ¿Es posible utilizar este mismo enfoque cuando se utilizan plantillas de Liquid? La plantilla podría ser algo como:

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

y rendido con:

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

Cuando se realiza un bucle a través de los artículos, me gustaría ser capaz de fragmentar caché de cada uno. ¿Alguna sugerencia?

Respuesta

8

Se puede definir etiquetas personalizadas en forma líquida, por ejemplo, si se pone esto en un inicializador

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) 

entonces puede hacer

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

muy cuidado con la forma en que la construcción de la memoria caché llave. Por supuesto, quiere evitar enfrentamientos, pero probablemente tampoco quiera que las personas puedan leer claves arbitrarias de su tienda de Memcache (que este código hace). Cómo se relaciona esto depende de quién tenga acceso a esto en su aplicación. Una estrategia sería asignar espacio de nombres a las claves de caché.

+0

+1 para la nota sobre tener cuidado con la asignación de nombres de teclas. Es muy importante cuando se les da a los inquilinos (en una aplicación de varios inquilinos) la capacidad de editar plantillas líquidas. –

+0

Awesome answer !! Funciona genial. Muchas gracias. – Ivangrx

+0

Muy bien, gracias –

Cuestiones relacionadas