Ruby on 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
- X
- 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 中國社區
- 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

## 基本資料

- 開發者： Rails核心團隊
- 發行日期：2005年12月13日
- 作業系統：跨平台
- 狀態：活躍
- 語言：Ruby
- 類型：Web應用框架
- 許可協議：MIT許可證