好吧,我在工作中有一个基本的CMS&我想尝试缓存基本上是一组动态生成的导航链接。在我的pages_controller
中,我有以下操作来切换页面的可见性,以及根据可见的页面创建@nav_links
变量的查询
before_filter :nav_links, only: [:index, :new, :show, :edit]
def toggle
@visibility = @page.visible? ? false : true
unless @page.update_attribute(:visible, @visibility)
flash[:alert] = "Uh oh! Looks like something went wrong."
end
expire_fragment "nav"
end
def nav_links
@nav_links = {}
groups = PageGroup.order("id")
groups.each do |group|
if group.visible?
@nav_links[group.name.to_sym] = group.pages.where(visible: true)
end
end
end
在我看来,我已将与@nav_links
相关的页面部分与<% cache "nav" do %>...<% end %>
包装在一起。所以我的问题是,在调用其中一个动作时会发生什么?
Rails是否仍然执行before_filter,查询数据库,&amp;每次访问重新填充@nav_links
哈希?或者只有在视图无法在缓存中找到@nav_links
的副本时才会调用它?如果每次都不执行,Rails默认使用SQL缓存来使用相同的结果,除非记录被更改了吗?
我是否还需要修改nav_links
方法,或者缓存是否按预期工作,只对视图和&amp;更新网页可见性的操作?
先谢谢;我是Rails的新手,所以我希望我的问题有道理。
答案 0 :(得分:0)
如果cache "nav"
包含某些模板代码,则该代码将运行一次,结果将被缓存,并且缓存将被重用,直到模板更改为止。您的cache
调用不引用任何数据对象,因此没有可以更改的应用程序状态会导致缓存被破坏。
此外,我非常确定expire_fragment
不适用于Rails 4 cache digests.