Ruby on Rails 初學入門(2) - config 與 MVC 關連性

Ruby on Rails 剛建立完專案後, 馬上要碰到的就是 config/* 和 MVC 的程式撰寫/修改等, 所以此篇就先簡單介紹 config/* 與 MVC 之間的檔案關聯性.

config 目錄的檔案列表

config/
  environments/ - 目錄
  initializers/ - 目錄
  boot.rb
  database.yml
  environment.rb
  routes.rb

MVC 的定義

RoR 的程式主要就是架構在 MVC (Model / View / Controller) 來撰寫, 那 MVC 代表哪些東西?

  • Model: 負責處理與資料庫之間的溝通 (繼承自 ActiveRecord::Base 的 class)
  • View: 產生前端頁面的 Template, 使用者是透過 View 秀出的頁面去送出 GET/POST 等要求.
  • Controller: 處理使用者的要求(POST/Create、GET/Read、PUT/Update、DELETE/Delete), 若要存取資料庫的資料, 則與 Model 溝通(new/find Model class), 最後再將資料送給 View, 透過 View 的 Template 產生使用者看到的頁面.
  • 更多 MVC 介紹可見: MVC - 維基百科,自由的百科全書

Rails 的 config 到 MVC 流程說明

首先若使用者輸入 http://DOMAIN/posts/1, 當此網址丟到 Server 後, Rails 那會做哪些事情? (註: 下述程式流程採用 scaffold 預設流程)

Rails user input data to server

Ruby on Rails request and MVC process

上圖中, 畫的就是使用者輸入的資料送進 Rails 後, Rails 程式運作流程:

  1. 資料由 Server 接收送到 Rails framework 中.
  2. 首先進入 config/boot.rb, boot.rb 會去呼叫 environment.rb.
  3. environment.rb 會將 environments, initializers 這兩個目錄下的檔案都載入進來, 最重要的 database 設定檔也是在此同時被載入進來(註: 這些載入我並沒有詳看 Source code, 是採猜測的方式, 若有錯誤還請指點), 於 environment.rb 會去拉 app 目錄下的 overrides.rb (此檔案預設不存在, 是可以讓你做額外擴充用, ex: 錯誤訊息中文化, 就是可用此將檔案, 將物件取代掉).
  4. 最後進入 routes.rb, 此檔是設定網址參數 如何拆解 並帶入 params 變數, 拆解完的變數再送給 app 的 Controller.
  5. 再來進入 app 的目錄, 就是跑 MVC 的程式.
  6. routes.rb 拆解的參數, 依上面的範例, 會是對應到 post GET /posts/:id  {:action=>"show", :controller=>"posts"}
  7. 拆解送到 Controller 會是 :controller => "posts", :action => "show", :id => "1", 於此會使用 posts controller 的 show action
  8. 於 Controller show 中, 使用 Post.find(params[:id]), 此 Post.find() 會去 Model 的 Post class 做 find() 動作.
  9. Controller 接收 Model 查 DB 後回傳的資料, 再將資料送到 View 的 Template, 於此就是回傳給使用者的頁面就產生完成.
  10. 再將此頁面回傳給使用者的瀏覽器即可.

在此附上上述兩張圖的 Dia 原始檔 (之後所有圖檔都會擺在這個檔案裡面.), 若覺得 畫的不對 或者 圖/線 用的不好, 表達不清楚等, 願意幫我改的話, 請自行下載修改, 再讓我更新圖片. Orz..

相關文章


關於 Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
本篇發表於 Programming。將永久鏈結加入書籤。

Ruby on Rails 初學入門(2) - config 與 MVC 關連性 有 2 則回應

  1. roga 說道:

    謝謝你的分享囉 ^^

  2. Tsung 說道:

    喔喔, 那個人是用 dia 裡面的 UML "相關角色" 的圖哩. XD

發表迴響