【问题标题】:Rails fragment caching rendered liquid templateRails 片段缓存渲染的液体模板
【发布时间】:2012-05-24 01:26:58
【问题描述】:

使用 ERB,您可以像这样在列表视图中对单个记录进行分段缓存:

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

因此,第二次查看列表时,每个呈现的项目都将从缓存中加载。使用 Liquid 模板时是否可以使用相同的方法?模板可能类似于:

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

并用以下方式渲染:

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

当它遍历项目时,我希望能够对每个项目进行分段缓存。有什么指点吗?

【问题讨论】:

    标签: ruby-on-rails memcached liquid


    【解决方案1】:

    您可以在液体中定义自定义标签,例如,如果您将其放入初始化程序中

    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)
    

    那你就可以了

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

    非常小心你如何构造缓存键。您当然希望避免冲突,但您也可能不希望人们能够从您的 memcache 存储中读取任意键(这段代码就是这样做的)。这有多重要取决于谁可以在您的应用程序中访问它。一种策略是命名空间缓存键。

    【讨论】:

    • +1 用于注意键命名的注意事项。让租户(在多租户应用程序中)能够编辑 Liquid 模板时非常重要。
    • 很棒的答案!效果很好。非常感谢。
    猜你喜欢
    • 2012-07-27
    • 2023-03-11
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多