读《应用rails进行敏捷web开发》第2版-19

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来判断是否有相应缓存,决定是否执行数据库访问代码

 

*缓存片段失效

后者用正则表达式匹配片段名,相符的均过期

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值