2006年10月20日星期五

小试Rails RJS

    RJS是Rails1.1的一个ajax的功能点。这里是一个简单明了的turturail。
    这个framework引入了一个rjs类型的文件,当control的function执行后,同名的rjs文件会被执行来动态产生出(或者说是被翻译为)javascript文件。
    rjs可以为如下的形式:
a = "fkp"
page.insert_html :bottom, 'list',
                 content_tag("li", "Fox2")
page.visual_effect :highlight, 'list', :duration => 3
page.replace_html 'header',
                  a + "b"
利用工具(for example:charles)可以得到其产生的response为:
try {
new Insertion.Bottom("list", "<li>Fox2</li>");
new Effect.Highlight("list",{duration:3});
Element.update("header2", "fkpb");
} catch (e) ......
    让人惊奇!我原来以为返回的是xml形式的(ajax必须返回xml吗?)。
    这样的做法产生一个问题就是js的代码量可能过大,当然这里是因为直接调用而显得很简短(application.js就可以放自定义的js function的地方)。这些js基本上是没有变化的,那么能不能直接传参数呢?这样产生出来的js可以cache(google web tools好像是这样做的)。而rjs的做法感觉是对于page.methodxx的返回值每次来个字符串的相加?
    rjs不仅提供了ruby语法的api来简化js的开发,更重要的是将ajax从view曾剥离出来,而且可以访问server端同名function的导出变量(@开头的?这湮没了xml在B/S间的传递)。
    跟其它的ajax框架不一样(大多可以用js直接访问后台的java function),这种方式去掉了访问的接口的定义(method的返回值没有定义),灵活性更强,因为view可能改变频繁。
    用这种模式后,契约存在两个地方:1)rjs和html。rjs用id来对html element控制,一般的ajax模式是把js和html混合写,由于id粒度过低,分开加大了耦合度;2)ruby和rjs之间的context。显然,google web tools解决了这些问题,但是需要讨厌的compile的过程。
    如果用java来实现,rjs模板可以用java写,也可以为脚本语言(jdk6有更好的支持),而主要不同可能是java代码和模板之间的contex的共享:java可能没有ruby实现的优雅。
    模板产生出来的javascriptbroswer端用如下的形式引用:
<script src="/javascripts/prototype.js?1159875410" type="text/javascript"></script>
<script src="/javascripts/effects.js?1159875410" type="text/javascript"></script>
还不知这些number是做何用处。

没有评论: