快速網站開發是 Ruby on Rails 的最大特色。雖為網站開發的後起之秀,但在短時間內已被國內外許多知名網站所採用,例如台灣的 T客邦及 Registrano 等。
於前篇文章,筆者介紹 Ruby on Rails 初步環境建置後,本篇將說明如何快速建立擁有新增/刪除/修改基礎功能的範例網站。
讀者可以使用 Ruby on Rails 提供的 "rails" 指令快速建立網站基礎模板。下列指令將建立名為 "demo" 的模板。
$ rails new demo
create
create README
create app/models
create app/views/layouts/application.html.erb
create config
create config/routes.rb
......
......
成功後,切換至上一步驟所產生的 demo 目錄下。
$ cd demo
接下來我們可以使用 Ruby on Rails 提供的 "bundle" 指令,檢查 Rails 的 Gemfile 是否已具備運作基礎環境所需的條件。
$ bundle
如果有發現缺少的套件," bundle" 會提醒讀者安裝。如下列情形,
Could not find gem 'sqlite3 (>= 0)' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.
然後輸入 "bundle install" 開始自動安裝這些缺少的相依性套件。
$bundle install
Fetching source index for https://rubygems.org/
Using rake (0.9.2)
Using abstract (1.0.0)
Using activesupport (3.0.9)
Using builder (2.1.2)
Using i18n (0.5.0)
Installing rack-test (0.5.3) from .gem files at /Users/mikel/Code/app/vendor/cache
Installing rails (3.0.0.beta) from .gem files at /Users/mikel/Code/app/vendor/cache
Using activemodel (3.0.9)
Using erubis (2.6.6)
...
...
...
Using rack (1.2.3)
Using rack-mount (0.6.14)
Your bundle is complete!
本篇操作將以「訪客留言板」為範例,利用 "scoffold" 指令快速建構名為 "guestbook" 的模板,且該模板具有兩個資料庫欄位的設計,一為 string 型態的 "name",另一為 string 型態的 "content"。
$ rails generate scaffold guestbook name:string content:string
invoke active_record
create db/migrate/20110830102544_create_guestbooks.rb
create app/models/guestbook.rb
invoke test_unit
create test/unit/guestbook_test.rb
create test/fixtures/guestbooks.yml
route resources :guestbooks
invoke scaffold_controller
create app/controllers/guestbooks_controller.rb
invoke erb
create app/views/guestbooks
create app/views/guestbooks/index.html.erb
create app/views/guestbooks/edit.html.erb
create app/views/guestbooks/show.html.erb
create app/views/guestbooks/new.html.erb
create app/views/guestbooks/_form.html.erb
invoke test_unit
create test/functional/guestbooks_controller_test.rb
invoke helper
create app/helpers/guestbooks_helper.rb
invoke test_unit
create test/unit/helpers/guestbooks_helper_test.rb
invoke stylesheets
create public/stylesheets/scaffold.css
接著可以使用 "rake" 指令來建立對應的資料庫設計。下列步驟會自動在資料庫中建立名為 "guestbooks" 的資料表,並且包含名為 "name" 的 string 型態欄位,以及名為 "content" 的 string 型態欄位。
$ rake db:migrate
(in /home/myhome/project/demo)
== CreateGuestbooks: migrating ===============================================
-- create_table(:guestbooks)
-> 0.0009s
== CreateGuestbooks: migrated (0.0010s) ======================================
最後,啟動 Rails 網頁應用伺服器。
$ rails server
成功之後,即可開啟瀏覽器,並瀏覽 "https://localhost:3000/guestbooks"。類似的結果如下圖。
▲ 圖1 guestbooks 的網頁呈現
至此已快速完成訪客留言板的基礎功能,並可以嘗試點選網頁中的 "New Guestbook" 來新增資料。
▲ 圖2 在 guestbooks 中新增資料
此外,讀者也可以試著操作 "Show" / "Edit" / "Destroy" 等功能。
"Scaffold" 使得 Rails 能夠快速完成基礎的新增/修改/刪除功能,所以接下來讀者只需要專注於呈現樣式的修改即可。
Scaffold 提供自動產生 Model、Views 和 Controller 程式碼的功能,得以快速完成簡易的 CRUD 功能的模板。雖然如此,但是建立後的程式碼不一定符合各種專案的需求,這也是有經驗的 Rails 程式設計師盡量少用 "scaffold" 的原因。所以並不是任何功能都需要藉助 "scaffold",讀者仍需視專案需求來活用 "scaffold"。
CRUD 指的是 Create、Read、Update、Destroy 四項資料庫基本操作。這些操作分別為:
* Create - 新增資料。
* Read - 讀取資料。
* Update - 更新資料。
* Destroy - 刪除資料。
Rails MCV 架構如下圖:
▲ 圖3 Rails MVC 架構(圖片來源:https://www.ils.unc.edu/~uskala/MVC.htm;作者為 uskala)
MVC 設計模式是現今網站開發常見的基礎架構。此架構分成三個部分:
* Model:資料與程式功能邏輯層。例如資料庫操作。
* View :網站頁面呈現層。
* Controller:負責 Model 與 View 的協調與溝通。例如接收到瀏覽器的要求後,可先向 Model 取得資料,再由 View 來整合輸出樣式。
當然,除了 Rails 外,也有許多網站開發框架 (Web Framework) 採用,例如 PHP 的 CakePHP,Python 的 Django。
Rails 的目錄結構如下圖:
▲ 圖4 Rails 目錄結構
Rails 會遵循 MCV 的架構來分別管理程式碼與資料的存放位置,並搭配 URL Routing 的概念處理網頁請求。這樣的目錄要求,使得不同功能的程式碼可以依功能分別置於不同的目錄下,而不同的網站元素,如 CSS 及 Javascript,也得以分別管理。如此,整個網站的專案結構將更清晰、更容易掌控。
檔案目錄與用途如下表:
檔案/目錄 | 用途 |
---|---|
app/ | 放置 Rails 一些 MCV 架構的目錄,底下會有 Controllers、models 和 views 目錄,未來所編寫的程式都會在這個目錄下編輯。 |
config/ | 整個專案的運作設定檔、網址列的路由規則、資料庫帳號密碼的設定等等。 |
db/ | 資料庫的結構概要,未來在多人開發的資料庫編修方面,在這裡就會變得很重要。 |
doc/ | 說明文件放置處。 |
lib/ | 若有自定的 Module 和類別檔案,放在這裡可以讓每個 controller 都用得到,不必再另外指定路徑 include file。 |
log/ | 應用程式記錄檔。 |
public/ | 圖檔、JavaScript、CSS 和其他靜態檔案擺放的地方。 |
script/ | 執行 Rails 的指令。 |
test/ | 用來執行臨時測試一些邏輯資料並不影響專案運行。 |
tmp/ | 放置暫時性的檔案。 |
vendor/ | 存放第三方外掛的目錄。 |
Gemfile | 設定 Rails 運作時會使用哪些 Gems 套件,用 bundle install 會依照裡頭的設置來安裝套件。 |
README | 讀我檔,一般簡要的說明安裝方法。 |
Rakefile | 載入一些 Rake 自動化處理的任務。 |
config.ru | 啟動伺服器設定。 |
本篇文章希望讀者對於 Rails 能有初步的認識,而下一篇專文也將為讀者介紹更多 Ruby on Rails 提供的功能。
麥克阿忠,資深網站程式開發者,興趣是攝影。目前擔任 Ruby on Rails 網站開發員,主要使用 Ubuntu Server 進行 Web 應用程式開發。
作者部落格 https://about.me/MichaelChen520
歡迎對 Ruby 有興趣的同好前來交流指教。