(译者按: 今年7月份举行的RailsConf 2006上,David Heinemeier Hasson作了一个主题演讲,很清楚地讲了Rails 1.2中对于REST的设计,以及REST风格给Web应用设计思想所带来的革新。我第一次看到这个视频,就认为这可能是对Web服务端开发具有历史意义的一次演讲。当时有一点时间,就一边听一边记,把这个演讲的开头翻译出将近3000字的内容,大约占整个演讲篇幅的1/4。后来我忙了起来,就没有时间把这个翻译做完。这个稿件在我硬盘上爬了两个多月,扔掉也不是,放出来又不完整。现在Rails 1.2已经发布了,我想越来越多的Web开发者都会回过头关心这个演讲的内容,所以突然生出一个想法,能不能把这个不完整的翻译稿放到自己的blog上,请有时间和精力的网友把翻译工作接力下去?
所以,我已经将自己翻译完成的开头部分(录像的1、2小节)放到这里,请有兴趣和热情的朋友对照录像内容把翻译接力下去,为国内的Web开发者介绍关于Web开发思想的这一重大革新。)
录像地址:
在这里
幻灯片地址:在这里
大家好,今晚我的演讲题目是《在Rails中探索资源的世界》。不过在我发表这个有点教程式的演讲之前,我想花几分钟来展示一下自己的傲慢。我总是要发表一些让人们不舒服的言论,现在这几乎已经是个传统了。
这次的会议展示了过去6个月以来世界各地的Rails开发者们发现的最令人兴奋的东西,现在看来,我们这个小圈子之外的人们也终于开始关注Rails社群了,这当然很酷。但同时我们也必须想清楚,我们何以会获得如此的关注?我听到了Thomas昨天和今天的发言,当然他的很多想法和建议是非常棒的,不过在同时应该记住,之所以今天我们会在这里聚会,之所以Rails是今天的Rails,恰恰因为我们对很多事情说了“不”,恰恰是因为我们将很多人拒之门外。如今Rails被越来越多的人接受,但我并不认为因此我们就可以背离先前的原则。所以,尽管我毫无疑问地支持Thomas的很多实用的建议,但对他的论调则不以为然。我不认为Rails应该向外部世界屈服,恰恰相反,Rails正在有力地让外部世界向我们屈服。在这个演讲里,我正是要好好谈谈世界的问题。我是说,现实的世界。你们中的很多人大概都知道,我这个人从不觉得现实世界是个很舒服的地方,倒是对于理想世界情有独钟。Rails很大程度上就是生活在一个理想世界里,在这里,Rails没有那些该死的现实世界里的枷锁。可惜,人们必须生活在现实世界里,而生活在现实世界实在是相当悲哀。在现实世界里,你会被沿袭了数十年的陈规陋习拖入深渊,这决不是Rails的成长之道,也不会是它未来的命运。我稍后会回到这个观点。
还是先来报报喜。我最近去了一趟日本,那里发生的事情让我很感兴趣。在这里,我们有大约三、五百人聚在一起,代表西方世界的Rails用户群。而在日本,Ruby的用户群数量庞大,热情高涨,他们做了大量的Ruby和Rails相关的工作,其中有很多我闻所未闻,比我们这个小房间里的人们所做的工作要多得多。他们正在创建更好几个理想的世界,大大超越我曾经梦想的那个世界。Thomas和我写的那本书自去年发行以来,已经买出5万多册,这经常被我们用来标志Rails的成功。而在日本,这本书刚刚翻译出版几个月,已经销售7千多册,他们还有3本日文书即将出版。在英语世界,到年底的时候大约还会有十本书上市,这都令人感到兴奋。从那些长时间使用Rails的团队那里得来的消息同样令人兴奋。我多次提到的43things.com团队,他们大规模应用了Rails,并且在面向公众的站点平台上进行了高负载量的测试。上次我问他们的时候,他们的Rails应用每天要产生350万动态网页,这已经是很了不起的事情!当然,这个演讲并不打算花更多的时间来自吹自擂,这个演讲的主题是有关CRUD的。
CRUD -- Create,Read,Update和Delete。这几个词汇概括了我们的主要的工作,这几个基本的概念概括了我们对对象空间中对象或者数据库表wrapper所能够的主要操作。但CRUD是有问题的。有什么问题呢?CRUD的问题是它的名字起得不好。不光名字起得不好,名声也不太好。他们是怎么说CRUD的呢?首先,他们说CRUD太简单,仅靠这四个操作,别指望能做出什么有趣的事情,世界太复杂了,不是这四个动词所能够描述的,所以CRUD太简单。正因为CRUD太简单,所以它们无法胜任真实工作。如果你只是用CRUD的话,你不可能把事情做到位。CRUD不是一种令人满意的方式,它不能够把人类了不起的智慧充分发挥出来。他们说,这不值得,你不应该把你的精力浪费在这四个动词上,它们太简单了。用CRUD应该感到羞愧。
我要说的是,他们错了。我今天的演讲就是要消除大家对CRUD的担忧,并且让大家像我一样学会爱上CRUD。
在对象的世界里,我们CRUD。而在数据库的世界里,我们也有四种基本操作,SELECT,INSERT,UPDATE,DELETE。不过数据库世界中的这四种操作存在已经好多年了,而且关于CRUD过于简单的说法,很大程度上就是在跟数据库这四大操作的对比中产生的。所以这并没有使我深入的思考CRUD问题。促使我深入思考CRUD的是HTTP。
近年来,我们经历了一次文艺复兴(Renaissance),一次HTTP的文艺复兴,HTTP有四个动词,GET,POST,PUT和DELETE,从而在上面的这个CRUD栈之上添加了崭新的一层。然而我们大多数人只使用GET和POST来思考HTTP和Web,而没有进而想到,HTTP的四个动词已经使之成为CRUD的一种新形式。我本人对此深感内疚,因为多年来我自欺欺人地认为HTTP只有GET和POST。正因为此,我才会占用各位一小时来讲述下面的内容。
<第8页>
请看,这是现在一个CRUD应用程序对外暴露功能的方式。当你想创建某个东西,你想一个特定的URL地址POST;当你想获取对象的内容,就把相关资源的位置放到URL里,然后GET;当你想改变这个对象,就用POST,有些人也用GET操作做这件事,其实这很不好。再有就是删除操作,也是用POST。
看着这样一幅图,有时我会觉得有点抓狂。我们在Rails中的一个宗旨是DRY,决不做重复的工作。你看看这里的动词,GET, POST,再看看这里的URL,我们所做的不正是重复性工作吗?看看第二行,我们说要GET第1个people,但是这个people的URL中包含show,GET和show,这两者不正是同样的意思吗?显然我们把一些事情做错了。之所以会把这些事情做错,根本上是因为我们没有把HTTP提供的CRUD操作利用好。如果我们能利用好,我们完全可以把事情做得清爽、漂亮,像这样:<第9页>
现在,URL只是标识了我们所关注的那个对象本身,而我们要对对象所做的操作则用四个动词来表达。之前,我们把操作和操作的对象混在一起,现在则明确地分开。这显然漂亮多了,但是为什么我们先前没有这么做呢?为什么HTTP的这部分能力一直被遗忘在角落里呢?这自然是有原因的。原因就是,要这么做会很痛苦,因为HTML以及Web世界里的其他现存的东西都没有欣赏到HTTP中已经存在的这种美,更没有为此做出相应的设计实现。既然Rails框架的目标把这些累赘东西踢走,是深埋于下的美妙的概念暴露在世人面前,那么为什么我们不能够试着来解决这个问题?这就是我今天要讲的东西,如何把上面那样重复的累赘的形式变成下面这个清爽漂亮的形式。事实上,这不仅仅是一个URL漂亮与否的问题。
在Rails 1.2中,如果你想把某个资源暴露出来,使客户能够用那种清爽的URL的方式去访问和操作资源,你只需要做这样的事情:<第10页>
这一语句将person作为一个资源,允许上述那种URL直接被映射到对应的方法。
(之下有一段幻灯片内容的解释,略过)。
怎么做到这一点呢?首先要增加PUT并将其传递给控制器的能力。但正如我之前所说,由于HTML天然地没有PUT的能力,所以这不太容易。没关系,我们要修正这一点。
<第11页>
首先是POST和GET,跟以前一样,所以没什么要特别说出的。有趣的部分是Update和Destroy。在Update部分,我们要找到一种方法告诉Rails,这个表单的action不是一个常规的POST方法,而是一个PUT。这里展示的是这个操作应该的模样。如果HTML表单支持PUT方法的话,我们本该这样写来着。很不幸,事实并非如此(HTML表单不支持PUT action),所以我们只能用POST来伪造一个PUT。在Rails中,当你这样写的时候,产生出来的表单里包含了一个隐藏的域,称为underscored method(下划线方法),这个下划线方法会去调用真正干事的那个方法。我们这么做就能让Rails相信,这个POST实际上是个PUT。
(以上翻译是录像1、2节内容,请热心网友接力翻译后面的内容)
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1413933