rails html模板,rails 模板中使用缓存

这个辅助函数主要用于高速缓存视图片段而不是整个动作或者页面的方法。这种技术是非常有用,如菜单,newstopics的列表,静态HTML片段,等等。此方法需要包含您希望缓存的内容的块。

使用此方法时,你列出的缓存依赖作为高速缓存的名称,如下所示:

All the topics on this project

这种方法假定当有新主题添加时,会创建project。从这个调用生成的缓存键会是这样的:

views/projects/123-20120806214154/7a1156131a6928cb0026877f8b749ac9

^class ^id ^updated_at ^template tree digest

缓存会自动处理当project的updated_at改变时

当你的模板依赖多种来源(尽可能保持事情简单),你可以命名这些依赖作为数组的一部分

All the topics on this project

This will include both records as part of the cache key and updating either of them will expire the cache.

Template digest

The template digest that's added to the cache key is computed by taking an md5 of the contents of the entire template file. This ensures that your caches will automatically expire when you change the template file.

Note that the md5 is taken of the entire template file, not just what's within the cache do/end call. So it's possible that changing something outside of that call will still expire the cache.

Additionally, the digestor will automatically look through your template file for explicit and implicit dependencies, and include those as part of the digest.

The digestor can be bypassed by passing skip_digest: true as an option to the cache call:

All the topics on this project

Implicit dependencies

Most template dependencies can be derived from calls to render in the template itself. Here are some examples of render calls that Cache Digests knows how to decode:

render partial: "comments/comment", collection: commentable.comments

render "comments/comments"

render 'comments/comments'

render('comments/comments')

render "header" => render("comments/header")

render(@topic) => render("topics/topic")

render(topics) => render("topics/topic")

render(message.topics) => render("topics/topic")

It's not possible to derive all render calls like that, though. Here are a few examples of things that can't be derived:

render group_of_attachments

render @project.documents.where(published: true).order('created_at')

You will have to rewrite those to the explicit form:

render partial: 'attachments/attachment', collection: group_of_attachments

render partial: 'documents/document', collection: @project.documents.where(published: true).order('created_at')

Explicit dependencies

Some times you'll have template dependencies that can't be derived at all. This is typically the case when you have template rendering that happens in helpers. Here's an example:

You'll need to use a special comment format to call those out:

The pattern used to match these is /# Template Dependency: ([^ ]+)/, so it's important that you type it out just so. You can only declare one template dependency per line.

External dependencies

If you use a helper method, for example, inside of a cached block and you then update that helper, you'll have to bump the cache as well. It doesn't really matter how you do it, but the md5 of the template file must change. One recommendation is to simply be explicit in a comment, like:

Now all you'll have to do is change that timestamp when the helper method changes.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值