MVC

意義

MVC是一套網頁開發的架構流程,代表著從前端到後端的各自分工。


M: Model

model 為一個虛擬的資料庫,但並非真實的資料庫,真正的資料庫還是得由正統的資料庫程式來扮演。在 Rails 裡,建立 model 能夠產生資料表 tables 的文字描述檔,接著透過 rails db:migrate 將資料表具象化後,就能將 tables 轉化成真正的資料庫並儲存資料了。

model 所扮演的角色是 controller 與資料庫之間的橋樑,將 controller 的 action 需要的資料,透過 model 以 SQL 語法轉譯向資料庫搜尋並提取資料,再把資料丟給 controller,或是將 controller 從 view 得到的資料,丟給 model,model 會再將 controller 給過來的資料,自行透過 SQL 語法,把資料儲存進資料庫裡。

由於 model 是負責與資料庫進行聯繫的地方,所以資料的驗證,主要是寫在 model 上,在 rails 裡,則是在 model 新增 validates 方法。

另外,多個 model 建立的 tables 們能夠透過primary_key, foreign_key 或是 belongs_to / has_one / has_many,將彼此的資料產生關聯。

腦的角色:所有的資料驗證都放在 model 內,包含商業邏輯,因為 model 就像大腦,負責處理「知不知道」的事情,比方說某個資料的處理需要先驗證 user 存不存在或是params 與資料庫有沒有吻合,這些都是跟大腦判斷有關的事情。


V: View

view 的功能主要是呈現出 controller 裡與 view 相對應的 action 所取得的資料在畫面上,或是將使用者於前端輸入的資料,送到 controller 進行後續處理。

通常不會在 view 裡進行任何的邏輯運算或是主動向任何地方討資料,view 唯一只需要做的就是呈現收到的資料或是將被給予的資料丟給 controller。

眼的角色:view 主要就是負責視覺,觀看,閱讀。


C: Controller

controller 可以算是整個架構的手腳,工具人的概念。controller 裡有很多 action。當 controller 收到請求觸發 action 時,就會開始執行 action 裡的 code,並在需要資料的時候,向 model 請求,取得資料後,再丟給 view。很顯然,controller 主要是負責資料運算與搬運。

手腳的角色:controller 就是負責所有的動作,所以裡面的 methods 才會叫 action,這個資料我要、這個資料我不要(白名單),這個資料拿給 model,這個資料拿給 view。所以 controller 通常不會太肥大,而 model 則會比較肥大。


Routes

在 rails 裡,多了一個像是地圖導覽的東西叫 routes,專門建立該用什麼方法執行網址路徑,而網址路徑會去呼叫相對應的 controller 及 action,進而呈現 MVC 的循環。