该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-08-13
Rails 作为一个 MVC 框架,其核心包括三个模块:ActiveRecord,ActionController 和 ActionView。今天这篇博文的主角是 ActionView,解开模板系统的魔术。
相信大部分的 Rails 程序员手边的书都是《Agile Web Development with Rails》,书中提到这一点的时候一笔带过,只是说 Rails 在这里用了一个小魔术。这里,我们就来揭开这个魔术吧!
Part 1. Template Files - 模板文件
|
|
返回顶楼 | |
发表时间:2008-08-14
引用 这就是 ERB 的真面目,也是为什么在 ActionView 中能够访问到 Controller 里实例变量的原因。
我期待的方式,就是楼主所描述的,可惜rails不是这样干的。 ActionController::Base和ActionView::Base是两个类,controller和view分别是这两个类的实例,所以action的代码和view/erb里的代码分别在这两个实例上下文中运行的,框架把controller的全部instance_variable复制给了view,而不是让ERB直接在controller上下文跑。 http://www.iteye.com/post/268223 刚查了下rails2.1,还保持着老的实现。 -- 这个简直不可理喻~ 有空查查merb,让自己保持一颗年轻的心,呵呵~ |
|
返回顶楼 | |
发表时间:2008-08-14
说实话,我也知道 Rails 从1.16开始就是直接用复制实例变量的方式来做的,这篇博文中提到的 ActionView 也只是作为一个引子,真正想讲的是 ERB。
当然,我也知道 Merb 甚至还有其他模板系统的存在,只是有些时候,用户的需求并不为技术所左右,单纯的考虑技术因素很难让自己的工作做的更好。大部分情况下,类似 ERB 这种简单实用的语法就是用户所青睐的。 最后还解答一下你的问题,即使 Rails 用的是我所说的方式,也不是让 ERB 在 controller 的上下文环境中运行。从层次结构上说,ERB 独立在 controller 和 view 之外。可能会类似这样的代码 class Render::Base def render( controller, view ) ERB.new( view.template_body ).result( controller.send(:binding) ) end end 代码有点粗糙,凑合看吧 |
|
返回顶楼 | |
发表时间:2008-08-14
是的,ERB是个独立的部份. 看到你上面的介绍才知道obj.private_methods.include?(:binding) == true,对于ERB来说很有用. 我只是不理解rails为什么不像你的方案,直接在controller的binding里搞.
ERB是个很清爽的东西,有两个地方不习惯: 1. result只接收binding,不接收某个obj(它内部调binding就成了)或Hash(它打成local variable) 2. 分界符不强.没找到如何把<% %> 换成类似${}的配置,只有<%- -%>. 楼上有没有什么建议? 同意你对merb的评论,我前几天扫了几眼merb源码,感觉很好. 上面的话是对俺自己说的,对付rails的坏毛病,希望从它上面能取到经. |
|
返回顶楼 | |
发表时间:2008-08-14
ERB说到底是个text template.
我一直期望的是有个dom template/renderer,也知道不太现实. 终极目标是组件化,至少需要 1. 对组件做抽象. 像extjs,flex那样,搞复杂的继承体系,事件,属性. 2. markup language,还要能与组件类无缝映射,IDE支持. 3. 消除服务器端和客户端概念,像JSF,.NET一样,破坏REST规约. 探索过markaby,haml,觉得一般. 看了看hpricot,觉得在它上面做手脚有点意思: http://www.beyondrails.com/blogs/47 |
|
返回顶楼 | |
发表时间:2008-08-18
我在上一个项目中基于Rails定制了一个框架,其中采用的方案是View部分以module形式出现,mixin到controller,然后ERB就是在controller的binding里面了。
感觉这么做比较简单,目前似乎也没有碰到什么问题。 |
|
返回顶楼 | |
发表时间:2008-08-18
我的项目是基于自定义模板的邮件系统,用ERB是我觉得最合适的一个方案了
|
|
返回顶楼 | |
发表时间:2008-08-19
rubynroll 写道 我在上一个项目中基于Rails定制了一个框架,其中采用的方案是View部分以module形式出现,mixin到controller,然后ERB就是在controller的binding里面了。 感觉这么做比较简单,目前似乎也没有碰到什么问题。 楼上的,你好。对你的方案很感兴趣,可否再说详细点. |
|
返回顶楼 | |
发表时间:2008-08-19
基本的思路都差不多的,view 并不一定要保存为一个文件,也可能是一个模块的计算结果,活着是数据库一条记录的某个字段
|
|
返回顶楼 | |
浏览 5595 次