`
rubyrock
  • 浏览: 22460 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Rails中CaptureHelper实现view片段的复用

阅读更多

今天在修改论坛的版主操作工具条时,偶然发现一个好东西,就是CaptureHelper中的Capture方法,可以很优雅的解决view中片段重复利用的问题。

 

设想一下这样的场景:论坛帖子页面需要为版主提供一个版主操作工具条,这个工具条件有好几个按钮,比如删帖,置精华和置顶等等,为生成这个工具条需要进行数量可观的条件判断以及html拼接。为方便版主使用,通常我们需要两个地方--顶部和底部都提供这个工具条。

 

按照通常的做法,把这两大段代码写上重复的两份,一份放在顶部,一份放在底部。这样导致的问题是:

1,重复的代码,修改维护起来特头疼,容易出错;

2,从执行效率来说,做两次重复的判断和拼接,不划算。

 

本着Rails DRY的原则,当然不允许这样的事情存在。今天发现Rails CaptureHelper中的Capture方法可以巧妙、优雅的解决这个问题。其实说起来也很简单,看一下下面的伪代码就明白了。

 

 #这是view中的代码 
<% toolbar_html = capture do %>
   #这里是生成toolbar的大段判断和拼接代码
<% end %>

#这里是顶部版主工具条
<%=toolbar_html%>

......
#这里是底部版主工具条
<%=toolbar_html%>

其原理也简单,无非是把做为capture block参数的erb段先执行生成html放到一个临时变量中,再在页面重复使用。

 

后来看了一下will_paginate的页码控制html,也是用了capture来实现重复利用。

 

 

Ruby on Rails不愧是从第一线的web开发人员开发出来的现代web框架,很多非常便利web开发的小工具,能大幅提供生产率啊!

分享到:
评论
3 楼 0701 2009-12-20  
这种问题一般都是用partial处理的较多,我想你那个其实也是基于局部模板的罢
2 楼 rubyrock 2009-12-16  
netfork 写道
局部模板是不是更优雅一点?


使用局部模板可以避免代码重复的问题,不过使用局部模板的话这部分代码是重复执行的,效率不好哦。
1 楼 netfork 2009-12-16  
局部模板是不是更优雅一点?

相关推荐

Global site tag (gtag.js) - Google Analytics