真是~太~可惜了~
昨天晚上很趕的送出文章後 12:00:06
11th鐵人賽宣告失敗ಥ_ಥ
當下除了悔恨還有一點難過
但就像馬拉松,不管抽筋還是腳痛,走都要走到終點
今天就要正式進入Rails 的世界
MVC可以說是Rails的中心理念,分別代表:
Model
邏輯處理(物件操作)Controller
視覺呈現View
路由控制(發送、接收請求)MVC架構是一種網頁Design Pattern(設計模式)
強調職責分離,開發與維護人員可以更快速對於目的與問題,找到該處理的程式,讓程式的修改與功能擴充簡化。
不論是寫好幾年的Rails老手,或剛接觸Rails的菜鳥,檔案架構大致相同,都是大家遵循MVC架構所賜。例如想找一個前端頁面,我會在view
資料夾底下找,而不會跑去controller
,大幅減少共同開發的成本
MVC 流程以現實狀況舉例,就像到了大醫院一樓,但不知道要看哪一科,我會先問ㄧ樓詢問處(Controller),志工再幫我問特定門診值班(Model),志工問到結果後,再告知查詢結果(View)
Controller 是從 ApplicationController
繼承而來的類別。
當一個請求(request)
進來,路由(router)
決定是哪個 Controller 的來執行,該 Controller 會負責該請求,通常先到Model要資料,拿到後做一些簡單的處理,找到對應的View來呈現成果給使用者。
按照 REST 規範來編寫的應用程式來說,Controller 的每個public method 都有一個對應的router,讓某個request 條理分明。
Controller 可以想成是 Model 與 View 的中間人,負責替 Model 將資料傳給 View,Controller 也將使用者更新或儲存的資料,存回 Model。
大部分的商業邏輯都放在這裡,透過ActiveRecord
Gem,使用特殊的ORM語法,讓我們可以很輕鬆的跟資料庫做溝通,也就是CRUD(新增/讀取/修改/刪除)
這些動作。如果沒有ORM語法,要自己撰寫SQL(結構化查詢語言),會降低開發速度及增加學習負擔。
接受controller傳過來的資料,算繪(Render)給網站的使用者。
View 是 Action View
模版,是由嵌入 HTML 的 Ruby 撰寫而成(Embedded Ruby, erb)。
Action View 提供了許多輔助方法(helper),用來撰寫表單、日期及字串等。每個 Controller 在 app/views 中都會有一個對應的資料夾,裡面包含了該 Controller 的模板檔案,檔名對應到 controller 的某一個method_name 。
回傳給用戶端的 HTML 是由這個 ERB 檔案(Templates)、版型(Layouts),以及其它引用的局部頁面(Partials)組成。
(這裡的erb換成Slim,Haml,甚至使用者可以自己改版型的Liquid 也可以。另外,如果是前後端分離,就不是用Rail的這幾個樣板引擎了)
Model : 包含所有的邏輯、物件,內容豐富。
Controller : 盡量輕量,這裡盡量不撰寫邏輯與物件,而以路由以傳遞資料為主。
View : 僅呈現,故盡量單純(笨笨)的呈現即可。
所以才有Fat model, skinny controller
的說法。
MVC就這樣出現!!
為什麼要有MVC?
答案是關注點分離,把原來亂七八糟前後端邏輯混在一起的義大利麵條式程式碼,整理出頭緒。是你的就是你的,你要存取資料庫就是去Model裡面,你要寫HTML就去View,絕對不會出現在View裡面下SQL Query這種事情。
使用MVC後,原本混在一起的code去符合MVC的規範,讓職責變得更清楚。
一張圖說明
1.使用者在Chorme 點擊一個按鈕,發出Ajax,例如顯示用戶user1資料
2.Rails Router 接到這個 request (ex.users/1
)
3.Router 找到對應的 UserController
4.Controller 找到 User Model
5.User Model 去 Database 要到user1
資料
6.User Model 將user1
傳回給UserControllers
7.UserController 傳給 View (ex. user/show.erb
)
8.View 將 最後結果轉換成瀏覽器看得懂的html給client端的Chrome
上面這張圖是我覺得解釋Rail MVC最清楚的,如果還有不懂歡迎留言詢問
最後來看一下Ruby老爸-松本行弘
在前幾天 Ruby conf China
的專訪
[寫 Ruby 時工作特別閑,總加班的人很難做出創造]
https://www.infoq.cn/article/3VAEudwWmwDhLx1LUbmX