imd*_*rek 9 memcached ruby-on-rails liquid
使用ERB,您可以在列表视图中对缓存单个记录进行分段,如下所示:
<% @items.each do |item| %>
<% cache item do %>
<%= item.name %>
<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
因此,第二次查看列表时,将从缓存加载每个呈现的项目.使用Liquid模板时是否可以使用相同的方法?模板可能类似于:
{% for item in items %}
{{ item.name }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
并呈现:
template = Liquid::Template.parse(template)
template.render('items' => @items)
Run Code Online (Sandbox Code Playgroud)
当它循环遍历项目时,我希望能够对每个项目进行分段缓存.有什么指针吗?
您可以在液体中定义自定义标签,例如,如果将其放入初始化程序中
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)
Run Code Online (Sandbox Code Playgroud)
那你可以做
{% cache "some_key" %}
...
{% endcache %}
Run Code Online (Sandbox Code Playgroud)
对构建缓存键的方式要非常小心.你当然希望避免冲突,但你也可能不希望人们能够从你的memcache商店中读取任意密钥(这段代码就是这样).如何匹配这一点取决于谁可以在您的应用中访问此功能.一种策略是命名空间缓存键.