2006年7月16日星期日

Scully on Rails,我的第一个Rails应用

这周完成了我的第一个Rails作品,我叫它Scully on Rails。

这个说起来还有点儿历史。我们的手机软件内部有个错误纪录系统。当出现重启之类问题的时候,会在文件系统中建立一个纪录文件。这个文件叫做X- File,是二进制文件,不能直接阅读内容。需要用工具将文件解码成文本信息,这个工具就是Scully。Scully是一个用Python写的脚本,各 种参数很多,使用比较麻烦。更麻烦的是,要解码一个X-File,还需要三、四个其他文件的支持以及另外一个分析工具,所以要把整个环境配制好,还是很费 功夫的。

所以我就考虑做一个Web应用,通过浏览器,将需要的文件上传到服务器,服务器在后台调用Scully,然后把得到的文本信息结果返回给用户,这样只要配制一套环境,大家就都可以用了。

Rails是以简单、快速著称的。但是真用起来,尤其是我这样的新手,还是有不小的门槛。特别是在几个问题上,我还是颇费了些功夫。

  • Form数据的传递。我比较喜欢使用比较低级的Form元素方法,诸如start_form_tag、text_field_tag之类。我觉得 它们能够提供比较灵活、快速的数据传递,不需要跟一个对象绑定,使用方便。但是上传的数据如何以何种形式存在params里,我却不甚了了,特别是 RadioBox。费了不少功夫试验。这里不得不抱怨一下Rails文挡,写的实在不怎么清楚;
  • 文件上传。对于不同大小的文件上传,Rails会产生不一样的结果。小于4k的文件,Rails直接生成一个StringIO的对象,大于的则生 成一个临时文件(Tempfile对象)。这种区别对于我的需要来说是很大的。我只要把上传的文件改个名字,然后拷贝到别的地方。这时候StringIO 就不很方便,还需要转换。关键是我起初并不知道有这样的区别,以为都是生成临时文件,走了弯路;
  • CSS的一个小trick也让我喝了一小壶。开始我把display: none;写到了CSS文件里面,然后用JavaScript写Element.show(’busy’),居然不起作用。试了半天才发现必须写成
  • 最后是一个目前没法解决的问题:Ajax不支持文件上传!这是JavaScript的限制,没商量。所以要做到漂亮的上传效果需要一些hack,不过我目前没时间弄。

总的来说,看多少资料也不如亲自动手做一个哪怕最简单的实例。

2006年7月13日星期四

RailsConf 2006

RailsConf 2006的Keynote视频已经陆续在这里贴 了出来,目前已经包括了Dave Thomas、Martin Fowler和David Heinemeier Hansson三个大牛的发言。我这两天都听了一下。有点意外的是,我听他们的发音都很轻松,只有Martin Fowler口音稍微重一点,但是也不难懂。还以为我的英语听力都殆尽了呢。

Martin Fowler一看就知道是一个老上台讲话的人,就准备一张小纸片,一边摸着胡子,一边讲,还不时灵活地翻着两个手腕。讲话中还以几天前在中国的见闻当作例子,可惜说的不具体。

没想到DHH的嗓音那么尖,嗓门也够大,还刚刚去了日本。前面Dave Thomas刚说Rails应该考虑企业用户的需求,加强对Legecy System的支持,例如Composite Primary Key。他就回应No Composite Primary Key,真不给面子!台下也跟着起哄。

这里列一些我听到的要点,备忘:

Dave Thomas:
  • Rails应该增加对企业用户的支持;
  • ActiveRecord应该直接从数据库表结构中的外键生成Model间的Relation;
  • Scaffolding应该能生成更有用的代码。
Martin Fowler:
  • Rails好就好在只专注做自己擅长做的事(database-backed web application);
  • 有时候在软件开发中,先射击后瞄准比先瞄准后设计要好,前提是子弹要够便宜。用户对一个已有(哪怕是非常粗糙)的实现的反馈比对凭空描述的反馈有 效的多。一个理想的软件开发可以是用户上午提出一个需求,下午就能给出实现让用户反馈,这样需要-实现-反馈的迭代快速进行,使用户真正全面地参与到软件 开发当中。这就是所谓Conversational Software Development。这里就需要软件工具提供快速开发的能力;
  • 软件工具应该是兼备开发快速和良好设计结构。
David Heinemeier Hansson:
  • CRUD应该成为Rails应用设计的一个度量指标。一个良好设计的Controller中的每一个Action应该是且仅是CRUD之一;
  • 未来的Rails将在URL做更多的文章,使其能跟CRUD一一对应起来;
  • 限制是一种解放;
  • ActiveResource将使用户能象ActiveRecord访问数据库一样访问其他Web应用的资源。

有很多内容,不能一一赘述,还是看视频吧。