(譯者按:?? 今年7月份舉行的RailsConf 2006上,David Heinemeier Hasson作了一個主題演講,很清楚地講了Rails 1.2中對于REST的設計,以及REST風格給Web應用設計思想所帶來的革新。我第一次看到這個視頻,就認為這可能是對Web服務端開發(fā)具有歷史意義的一次演講。當時有一點時間,就一邊聽一邊記,把這個演講的開頭翻譯出將近3000字的內(nèi)容,大約占整個演講篇幅的1/4。后來我忙了起來,就沒有時間把這個翻譯做完。這個稿件在我硬盤上爬了兩個多月,扔掉也不是,放出來又不完整。現(xiàn)在Rails 1.2已經(jīng)發(fā)布了,我想越來越多的Web開發(fā)者都會回過頭關心這個演講的內(nèi)容,所以突然生出一個想法,能不能把這個不完整的翻譯稿放到自己的blog上,請有時間和精力的網(wǎng)友把翻譯工作接力下去?
??? 所以,我已經(jīng)將自己翻譯完成的開頭部分(錄像的1、2小節(jié))放到這里,請有興趣和熱情的朋友對照錄像內(nèi)容把翻譯接力下去,為國內(nèi)的Web開發(fā)者介紹關于Web開發(fā)思想的這一重大革新。)
錄像地址:
在這里
幻燈片地址:在這里
大家好,今晚我的演講題目是《在Rails中探索資源的世界》。不過在我發(fā)表這個有點教程式的演講之前,我想花幾分鐘來展示一下自己的傲慢。我總是要發(fā)表一些讓人們不舒服的言論,現(xiàn)在這幾乎已經(jīng)是個傳統(tǒng)了。
這次的會議展示了過去6個月以來世界各地的Rails開發(fā)者們發(fā)現(xiàn)的最令人興奮的東西,現(xiàn)在看來,我們這個小圈子之外的人們也終于開始關注Rails社群了,這當然很酷。但同時我們也必須想清楚,我們何以會獲得如此的關注?我聽到了Thomas昨天和今天的發(fā)言,當然他的很多想法和建議是非常棒的,不過在同時應該記住,之所以今天我們會在這里聚會,之所以Rails是今天的Rails,恰恰因為我們對很多事情說了“不”,恰恰是因為我們將很多人拒之門外。如今Rails被越來越多的人接受,但我并不認為因此我們就可以背離先前的原則。所以,盡管我毫無疑問地支持Thomas的很多實用的建議,但對他的論調(diào)則不以為然。我不認為Rails應該向外部世界屈服,恰恰相反,Rails正在有力地讓外部世界向我們屈服。在這個演講里,我正是要好好談談世界的問題。我是說,現(xiàn)實的世界。你們中的很多人大概都知道,我這個人從不覺得現(xiàn)實世界是個很舒服的地方,倒是對于理想世界情有獨鐘。Rails很大程度上就是生活在一個理想世界里,在這里,Rails沒有那些該死的現(xiàn)實世界里的枷鎖。可惜,人們必須生活在現(xiàn)實世界里,而生活在現(xiàn)實世界實在是相當悲哀。在現(xiàn)實世界里,你會被沿襲了數(shù)十年的陳規(guī)陋習拖入深淵,這決不是Rails的成長之道,也不會是它未來的命運。我稍后會回到這個觀點。
還是先來報報喜。我最近去了一趟日本,那里發(fā)生的事情讓我很感興趣。在這里,我們有大約三、五百人聚在一起,代表西方世界的Rails用戶群。而在日本,Ruby的用戶群數(shù)量龐大,熱情高漲,他們做了大量的Ruby和Rails相關的工作,其中有很多我聞所未聞,比我們這個小房間里的人們所做的工作要多得多。他們正在創(chuàng)建更好幾個理想的世界,大大超越我曾經(jīng)夢想的那個世界。Thomas和我寫的那本書自去年發(fā)行以來,已經(jīng)買出5萬多冊,這經(jīng)常被我們用來標志Rails的成功。而在日本,這本書剛剛翻譯出版幾個月,已經(jīng)銷售7千多冊,他們還有3本日文書即將出版。在英語世界,到年底的時候大約還會有十本書上市,這都令人感到興奮。從那些長時間使用Rails的團隊那里得來的消息同樣令人興奮。我多次提到的43things.com團隊,他們大規(guī)模應用了Rails,并且在面向公眾的站點平臺上進行了高負載量的測試。上次我問他們的時候,他們的Rails應用每天要產(chǎn)生350萬動態(tài)網(wǎng)頁,這已經(jīng)是很了不起的事情!當然,這個演講并不打算花更多的時間來自吹自擂,這個演講的主題是有關CRUD的。
CRUD -- Create,Read,Update和Delete。這幾個詞匯概括了我們的主要的工作,這幾個基本的概念概括了我們對對象空間中對象或者數(shù)據(jù)庫表wrapper所能夠的主要操作。但CRUD是有問題的。有什么問題呢?CRUD的問題是它的名字起得不好。不光名字起得不好,名聲也不太好。他們是怎么說CRUD的呢?首先,他們說CRUD太簡單,僅靠這四個操作,別指望能做出什么有趣的事情,世界太復雜了,不是這四個動詞所能夠描述的,所以CRUD太簡單。正因為CRUD太簡單,所以它們無法勝任真實工作。如果你只是用CRUD的話,你不可能把事情做到位。CRUD不是一種令人滿意的方式,它不能夠把人類了不起的智慧充分發(fā)揮出來。他們說,這不值得,你不應該把你的精力浪費在這四個動詞上,它們太簡單了。用CRUD應該感到羞愧。
我要說的是,他們錯了。我今天的演講就是要消除大家對CRUD的擔憂,并且讓大家像我一樣學會愛上CRUD。
在對象的世界里,我們CRUD。而在數(shù)據(jù)庫的世界里,我們也有四種基本操作,SELECT,INSERT,UPDATE,DELETE。不過數(shù)據(jù)庫世界中的這四種操作存在已經(jīng)好多年了,而且關于CRUD過于簡單的說法,很大程度上就是在跟數(shù)據(jù)庫這四大操作的對比中產(chǎn)生的。所以這并沒有使我深入的思考CRUD問題。促使我深入思考CRUD的是HTTP。
近年來,我們經(jīng)歷了一次文藝復興(Renaissance),一次HTTP的文藝復興,HTTP有四個動詞,GET,POST,PUT和DELETE,從而在上面的這個CRUD棧之上添加了嶄新的一層。然而我們大多數(shù)人只使用GET和POST來思考HTTP和Web,而沒有進而想到,HTTP的四個動詞已經(jīng)使之成為CRUD的一種新形式。我本人對此深感內(nèi)疚,因為多年來我自欺欺人地認為HTTP只有GET和POST。正因為此,我才會占用各位一小時來講述下面的內(nèi)容。
<第8頁>
請看,這是現(xiàn)在一個CRUD應用程序對外暴露功能的方式。當你想創(chuàng)建某個東西,你想一個特定的URL地址POST;當你想獲取對象的內(nèi)容,就把相關資源的位置放到URL里,然后GET;當你想改變這個對象,就用POST,有些人也用GET操作做這件事,其實這很不好。再有就是刪除操作,也是用POST。
看著這樣一幅圖,有時我會覺得有點抓狂。我們在Rails中的一個宗旨是DRY,決不做重復的工作。你看看這里的動詞,GET, POST,再看看這里的URL,我們所做的不正是重復性工作嗎?看看第二行,我們說要GET第1個people,但是這個people的URL中包含show,GET和show,這兩者不正是同樣的意思嗎?顯然我們把一些事情做錯了。之所以會把這些事情做錯,根本上是因為我們沒有把HTTP提供的CRUD操作利用好。如果我們能利用好,我們完全可以把事情做得清爽、漂亮,像這樣:<第9頁>
現(xiàn)在,URL只是標識了我們所關注的那個對象本身,而我們要對對象所做的操作則用四個動詞來表達。之前,我們把操作和操作的對象混在一起,現(xiàn)在則明確地分開。這顯然漂亮多了,但是為什么我們先前沒有這么做呢?為什么HTTP的這部分能力一直被遺忘在角落里呢?這自然是有原因的。原因就是,要這么做會很痛苦,因為HTML以及Web世界里的其他現(xiàn)存的東西都沒有欣賞到HTTP中已經(jīng)存在的這種美,更沒有為此做出相應的設計實現(xiàn)。既然Rails框架的目標把這些累贅東西踢走,是深埋于下的美妙的概念暴露在世人面前,那么為什么我們不能夠試著來解決這個問題?這就是我今天要講的東西,如何把上面那樣重復的累贅的形式變成下面這個清爽漂亮的形式。事實上,這不僅僅是一個URL漂亮與否的問題。
在Rails 1.2中,如果你想把某個資源暴露出來,使客戶能夠用那種清爽的URL的方式去訪問和操作資源,你只需要做這樣的事情:<第10頁>
這一語句將person作為一個資源,允許上述那種URL直接被映射到對應的方法。
(之下有一段幻燈片內(nèi)容的解釋,略過)。
怎么做到這一點呢?首先要增加PUT并將其傳遞給控制器的能力。但正如我之前所說,由于HTML天然地沒有PUT的能力,所以這不太容易。沒關系,我們要修正這一點。
<第11頁>
首先是POST和GET,跟以前一樣,所以沒什么要特別說出的。有趣的部分是Update和Destroy。在Update部分,我們要找到一種方法告訴Rails,這個表單的action不是一個常規(guī)的POST方法,而是一個PUT。這里展示的是這個操作應該的模樣。如果HTML表單支持PUT方法的話,我們本該這樣寫來著。很不幸,事實并非如此(HTML表單不支持PUT action),所以我們只能用POST來偽造一個PUT。在Rails中,當你這樣寫的時候,產(chǎn)生出來的表單里包含了一個隱藏的域,稱為underscored method(下劃線方法),這個下劃線方法會去調(diào)用真正干事的那個方法。我們這么做就能讓Rails相信,這個POST實際上是個PUT。
(以上翻譯是錄像1、2節(jié)內(nèi)容,請熱心網(wǎng)友接力翻譯后面的內(nèi)容)
?
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1413933