轉自:http://hi.baidu.com/waytofall/blog/item/dad928f9d042b65f242df222.html
Ruby On Rails 中MVC 架構淺談
MVC 最早是由Trygve Reenskaug(似乎是一位挪威人,奧斯陸大學教授,自稱是一位自學成才的職業軟體工具開發人員)提出的設計模式。它起初被應用於使用者介面的開發,而廣泛應用於web application 的開發卻只是近幾年的事情。MVC 作為一種設計模式可以被所有架構和平台所使用,並不是Ruby On Rails專屬,那麼為什麼MVC 在Ruby On Rails 中顯得格外重要?原因是Ruby On Rails用固定的目錄結構(當然也許可能還有其他的一些筆者並不瞭解的機制)“強制”了開發人員必須遵循MVC 的設計模式。Ruby On Rails 是一種“慣例重於配置”的開發架構,所以省去不必要的配置累贅而專心於應用程式的開發顯然是一件大快朵頤的事情。當然,MVC 也在web 應用程式開發中有其優越性,所以當下RubyOn Rails 才如此受追捧。
關於MVC,本文只是淺談一下MVC 是如何被運用在Ruby On Rails 架構中的,所以論述都針對最簡單的一些Rails 開發的情境。這樣做的好處就是可以讓對MVC 和Ruby On Rails 都不太熟悉的初學者儘快對他們有一個大體的認,從而可以快速投入到體驗Ruby On Rails 開發樂趣的實踐中。
MVC introduction
首先還是要贅述一下MVC 到底是什麼。
M:Model
V:View
C:Controller
Model 層是和資料庫緊密聯絡的一層,也是整個應用程式設計的核心。Model可以理解為所有應用程式中的對象以及封裝在其中的各種操作。Ruby On Rails架構將物件導向的思想貫穿始終,所以Model 當然所有操作所圍繞的中心。
View 是與使用者打交道的一層,實際上就是一些嵌入了ruby 代碼的html 頁面。使用者通過View 對web 應用程式進行一些操作的申請,並通過View 查看操作的結果。
Controller 層可能是比較難以表述的一層,通常的說法是用於串連Model 層和View 層。Controller 可以理解為一些動作的集合,這些動作是為View 與Model之間進行互動(View 向Model 提出資料的申請,Model 向View 返回資料)進行服務的,Controller 同時也可以對這些資料進行處理。更多具體的實現問題將放在後面講。
Why MVC?
通過以上的表述,讀者可以對MVC 有一個概括性的認識,但是對MVC 的優越性可能認識並不充分,所以我會講一下MVC 的好處。
Web 應用程式的本質就是使用者通過網頁對網站的資訊進行各種各樣的操作,有時是讀,有時是寫,有時可能是更複雜的操作,比如將資訊分類排序或進行一些處理再返還給使用者。而所有的這些資訊都是儲存在伺服器的資料庫當中的(極少量會儲存在使用者本地如cookie)。這也就意味著,web 應用程式的開發的實質就是提取使用者的行為,從資料庫中讀取資訊並返還給使用者,周而復始。如果僅僅從這個層面上來說,web 應用程式的開發就是一些對使用者行為的捕捉和資料庫操作以及顯示資訊的集合。但是如果把所有這些操作都放在一個檔案中不但組織起來麻煩,可讀性差,結構混亂,而且不利於代碼的複用。於是MVC 的架構就是用於將這些混亂的代碼分隔開從而實現使結構更清晰、使代碼更易讀並提高其複用性和抽象性的作用。
Model 是抽象出來的類,也是資料的實體。View 負責提取使用者的行為並向使用者顯示資料。而Controller 負責把他們聯絡起來,使M-V 能高效地協調工作。
How Rails join them together
至此,讀者對Model 和View 都有了比較深刻的理解,但是對於Controller可能都比較迷茫。關於Controller 到底是怎麼把M 和V 聯絡在一起的也很模糊。這個章節就會對這個問題做重點描述。首先,讓我們先看看Rails 是如何運行一個web 應用程式的吧。
在Rails 的工程檔案夾中,有一個app 目錄,用於儲存所有M-V-C 代碼。Model目錄存放Model,Controller 目錄存放Controller,View 目錄存放View。在View目錄中還會有很多子目錄,這些子目錄名都對應一個Controller。而這些子目錄中儲存著很多View , 這些View 有都對應相應的Controller 中的一個action(Controller 就是由一個一個action 組成的)。
當我們開啟一個Rails 的頁面時,機制實際上是這樣的:伺服器調用某個Controller 中的action,並開啟與這個action 相對應的View。對應action 中的變數可以為其View 所用。這些變數從哪裡來?
讓我們再進一步地講一下Model。之前曾講過,Model 實際上就是一些類以及對應於這些類的操作。而這些類又作何用?事實上在大部分時候,Model 的每一個類都對應資料庫中的一個表。如果開啟Model 檔案,你無法看到關於類中屬性的定義,這些屬性在哪?答案是資料庫。Rails 架構會根據資料庫中的列自動獲得某個Model 的屬性。所以Model 與資料庫的聯絡是如此緊密。
知道了這些之後,接著回答之前的問題:action 中的變數來源於Model。這也是Controller 之所以可以聯結M 和V 的另一個原因:Controller 可以調用Model的對象和其方法。
讓我們總結一下MVC 工作的機理:Controller 從View 中接受請求,訪問相應Model 中的實體,調用Model 中的方法將資料處理好返回給View,View 再負責顯示這些資料,僅此而已。
如果以上還不夠淺顯,你可以想象成在餐館中吃飯的情境:顧客向服務員點菜,服務員根據顧客點的菜讓廚師烹調,服務員再把菜上到顧客的飯桌上。顧客是View,服務員是Controller,廚師是Model。