Rails

**Ruby on Rails**（官方簡稱為 Rails，亦被簡稱為 RoR），是一個使用 Ruby 語言寫的開源 Web 應用框架，它是嚴格按照 MVC 結構開發，努力使自身保持簡單，使實際應用開發時的程式碼更少，使用最少的組態。

Rails 的設計原則包括「不做重複的事」（Don't Repeat Yourself）和「慣例優於設定」（Convention Over Configuration）。

## Ruby on Rails 介紹

Ruby on Rails 是一種結合 Ruby 語言與 Rails 平台的一種網頁程式框架，Ruby 語言以自然、簡潔、快速著稱，全面支援物件導向程式設計，而 Rails 則是 Ruby 廣泛應用方式之一，在 Rails 平台上設計出一套獨特的 MVC 開發架構，採取模型（Model）、視圖（View）、控制器（Controller）分離的開發方式，不但減少了開發中的問題，更簡化了許多繁複的動作。

## 應用

Ruby on Rails 的數千個程式已經線上上得到應用。
現在使用 Ruby on Rails 的網站有：

* Basecamp
* Twitter
* GitHub
* Groupon
* Shopify
* Yellow Pages
* GitLab
* Coinbase
* Crypto.com

## 歷史

於 2004 年 7 月，Rails 的創始人大衛・漢森從 37signals 公司的項目管理工具 Basecamp 分離出 Ruby on Rails，並且以開源方式發佈。

Rails 在發佈以後的短短的時間內就迅速獲得很多開發人員歡迎，大衛認為這歸功於 Rails 設計為 opinionated software。Rails 當中有很多規矩從一開始就按照 David 的意見制定好了，所以在 Rails 上開發應用程式時，開發人員可以專注於應用程式自身的設計，省卻那些花在瞭解及組態基礎框架上面的時間。這也正是 Rails 很重要的精神「約定優於組態」，開發人員遵照 Rails 本身的慣例便可以省卻組態組態檔的時間；此外，Rails 雖然強調慣例的重要及便利性，但針對不同的需求，Rails 也提供修改的空間讓開發人員可以進行自訂的組態。

## Rails 的運作模式

Rails 框架是以固定的命名習慣來自動判斷整個架構，預設下會將網址分析成 http://domain-name/ControllerName/ActionName/Attribute/ 然後執行目標 Controller 中的 Action，並取出指定的 View（視圖）回傳給瀏覽器顯示。

面對資料庫則以 Model（模組）的形式，藉由 Active Record 作為與資料庫之間的傳輸介面。

## Rails 的 MVC 架構

Ruby on Rails 的模型 - 視圖 - 控制器架構由以下各部分組成：

### 模型

模型包含著應用的狀態，狀態可能是臨時的也可能是長久性儲存在資料庫中的。需要注意的是模型不僅包含資料，而且包含資料代表的邏輯。在 Rails 中，_**模型**_通常是由一些代表關聯式資料庫中 RDBMS 表的類組成的。

在 Rails 中，模型類是通過 Active Record 模式進行處理的。一般來說，程式設計師要做的是繼承 `ActiveRecord` 類，同時程式會自動計算出要使用哪個 RDBMS 表，這個表有哪些列。表與表之間的關係通過簡單的命令來指明。

### 視圖

View 負責根據 Model 中的資料顯示使用者介面。作為 web 應用，Rails 裡的 View 通常是生成整個或者部分網頁。當然可以是 XML 或者甚至是 JavaScript 程式碼。表現為使用內嵌 Ruby 的 HTML／XML／JavaScript 模板。

### 控制器

控制器將使用者介面和資料模型關聯起來，並充當協調運作的角色。它接收各種使用者操作，更新資料模型，並用合適的 view 展示結果給使用者。像他的名字一樣，可以說應用的主要控制中心就是各個控制器。

## Rails 的組成模組

### 模型：Active Record

ActiveRecord 實現了 Rails 的物件關係對映。

### 控制器和視圖：ActionPack

ActionController 是 Rails 中的控制器，提供各種方法供使用者操作使用。

ActionView 是 Rails 中的視圖，負責展現使用者介面。

### 常用實用工具：ActiveSupport

ActiveSupport 包提供一些工具和支援程式碼。

### 處理郵件：ActionMailer

ActionMailer 用來傳送和接收 email。

### Web 服務：ActionWebService

ActionWebService 來提供 SOAP 和 XML-RPC 支援。需要注意的是，Rails 趨向使用更加簡單明瞭的 REST 方式 web 服務而不再提倡 SOAP 格式的 web 服務。ActionWebServices 在未來的版本裡面會逐步淡出。

### 網路資源：ActiveResource

用 REST 對 Web 服務提供了優秀的支援。這種風格的 Web 服務使用指定的資源。

### Rails 中的 AJAX

AJAX（非同步 JavaScript 與 XML）是一種非同步傳輸介面，可以藉由瀏覽器使用 JavaScript 和 XML 或其他資料格式來處理傳輸請求，而將 Web 伺服器作為後台來處理，這樣無須載入額外的網頁。Rails 內建有 Prototype 套件來實現這個技術。Ajax 已經和 Ruby on Rails 結合在了一起成為了一個新的系統叫做「Ajax on Rails」。Rails 提供一些助手工具來更方便地實現 AJAX 應用。
Rails 提供了一些 Helper，可以在伺服器一端用純 Ruby 語言生成給瀏覽器用的 JavaScript 程式碼，從而讓 Rails 的開發者不需掌握 JavaScript 就可以簡單方便的開發出 AJAX 的應用。

## Rails 和 Web 服務

稍早的版本的 Rails 中提供了 ActionWebService 作為開發 XML-RPC 和 SOAP 的 web 服務的基礎。但是最近的 Rails 1.2 更加傾向於是用 REST 方式的 web 服務，而 ActionWebService 在 Rails 2.0 中作為 plugin 而不再是 rails 核心的一部分。

## Web 伺服器支援

對於開發和測試來說，一個很輕量的 WEBrick 網頁伺服器已經被包含在了 Ruby 中，常被用來作為應用伺服器。而對於生產應用，常推薦使用帶 FastCGI 的 Apache 或者 Lighttpd，但任何支援 CGI 或者 FastCGI 的網頁伺服器都可以使用。在 Apache 上，mod\_ruby 也可以考慮用來提高效能。

## 資料庫支援

使用 Rails 的架構開發網路應用一般都使用資料庫，所以推薦使用一個關聯式資料庫系統來進行數據儲存，若不能運行一個關聯式資料庫伺服器，Rails 支援嵌入式資料庫 SQLite。Rails 還支援關聯式資料庫系統，包括 MySQL、PostgreSQL、IBM DB2、Oracle 和 SQL Server。

## 系統要求

* Ruby 語言
* Web 伺服器，如 Apache、lighttpd 等。
* FastCGI，或者 Mongrel 為了提高效率
* 資料庫和驅動程式

## 整合式開發環境

開發用的 IDE 有：Eclipse，MyEclipse，NetBeans，RubyMine，Aptana，Sublime Text，Visual Studio Code

## 類似的框架

### PHP 語言

* CakePHP
* Laravel
* Yii
* CodeIgniter

### Python 語言

* Django
* TurboGears

### Perl 語言

* Catalyst

### Elixir 語言

* Phoenix Framework

### Node.js 環境

* Sails.js

## 參考文獻

## 外部連結

### 官方網站

* （英文）Ruby On Rails 官方網站（頁面存檔備份，存於網際網路檔案館）
* （繁體中文）Ruby on Rails 台灣官方網站（頁面存檔備份，存於網際網路檔案館）

### 其他

* Ruby 中國社群（頁面存檔備份，存於網際網路檔案館）
* Onlamp.com 的 Ajax on Rails（頁面存檔備份，存於網際網路檔案館）
* Fast-track your Web apps with Ruby on Rails（頁面存檔備份，存於網際網路檔案館）（David Mertz article at IBM developerWorks）
* Ruby on Rails 和 J2EE：兩者能否共存？（頁面存檔備份，存於網際網路檔案館）
* Full Ruby on Rails Tutorial
* Steve Yegge 把 Rails 移植到 JavaScript/Rhino（頁面存檔備份，存於網際網路檔案館）
* Ruby 編寫的 JavaEye 中的 ruby 論壇