p501
局部页面模板
澄清下概念
.controller将action模板计算完成后,将其放入布局模板,然后返回. 换句话说:layout模板包含action模板
而局部页面模板这是action模板包含局部页面模板,用于对数据的处理,在不同的页面下看起来外观一样(如果加载同一个局部页面模板的话)
_item.html.erb 位于app/views/:controller目录下.
action模板里
<%=render (:partial=>"item",:object=>@my_item) %>
_item.html.erb里可以访问@my_item变量,但变量名为局部模板文件名本身,此处就是item
比如item.price访问
省略:object参数:会自动传入控制器实例变量@item供其使用(item的名称来自局部模板文件名)
通过:locals传递更多的变量
<%render( :partial=>"item",:object=>@my_item,:locals=>{:value1="value1",:value2=>"value2"}%>
意味着使用两个局部模板来创建页面:
其中_item.html.erb里可以使用item变量和item_counter变量(表示第几个元素),其页面片段重复item_counter次.
而_space.html.erb也会重复item_counter-1次.
最终上面代码会变成
_item.html.erb
_space.html.erb
_item.html.erb
_space.html.erb
_item.html.erb
如果items有3个元素的话
会加载啊品牌/view目录下的shared/_some.html.erb模板
由此可以多个控制器共享一个模板
局部模板也可以使用布局模板,加载app/view/:controller/_admin.html.erb布局模板,,渲染
app/view/:controller/_some.html.erb
片段缓存
前者使用了@articles实例变量,控制器中的代码是
@articles=Article.find_recent
1.前者定义了名称为cache1的片段缓存
2.cache1被访问时仅仅页面被缓存,而控制器中的@articles赋值仍然会自行---仍然会访问数据库
cache2由于将Article.find_recent(这个访问数据库的代码)写在了视图中,因此缓存被访问时,就不会自行.
结论:片段缓存机制缓存且仅缓存视图中的代码,控制器中的任何代码都需要执行.因此在使用片段缓存时,需要注意,否则没有起到缓存的最佳效果
前者的方式有个补救措施----在控制器中访问代码的部分使用read_fragment来判断是否有相应缓存,决定是否执行数据库访问代码
*缓存片段失效
后者用正则表达式匹配片段名,相符的均过期