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 № 1Sie 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.