/ / Rails fragment caching gerenderte flüssige Vorlage - Ruby-on-Rails, memcached, flüssig

Schienenfragmentcaching übertragene flüssige Schablone - Rubin auf Schienen, Memcached, Flüssigkeit

Mit ERB können Sie einzelne Datensätze in einer Listenansicht wie folgt fragmentieren:

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

Somit wird jedes gerenderte Element beim zweiten Anzeigen der Liste aus dem Cache geladen. Ist es möglich, denselben Ansatz bei der Verwendung von Liquid-Vorlagen zu verwenden? Die Vorlage könnte ungefähr so ​​aussehen:

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

und gerendert mit:

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

Wenn die Elemente durchlaufen werden, möchte ich in der Lage sein, die einzelnen Elemente zu fragmentieren. Gibt es Zeiger?

Antworten:

8 für die Antwort № 1

Sie können benutzerdefinierte Tags in liquid definieren, wenn Sie diese beispielsweise in einen Initialisierer einfügen

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)

Dann kannst du es tun

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

Sein sehr Gehen Sie beim Erstellen des Cache-Schlüssels vorsichtig vor. Natürlich möchten Sie Konflikte vermeiden, aber Sie möchten wahrscheinlich auch nicht, dass Benutzer beliebige Schlüssel aus Ihrem Memcache-Speicher lesen können (was dieser Code bewirkt). Wie diese übereinstimmen, hängt davon ab, wer in Ihrer App Zugriff darauf hat. Eine Strategie wäre, Namespace-Cache-Schlüssel zu verwenden.