# 1.1 簡介
Ruby on Rails(或者簡稱“Rails”)是一個 Web 開發框架,使用 Ruby 編程語言開發。自 2004 年出現之后,Rails 就迅速成為動態 Web 應用開發領域功能最強大、最受歡迎的框架之一。使用 Rails 的公司有很多,例如 [Airbnb](http://airbnb.com/)、[Basecamp](http://basecamp.com/)、[Disney](http://disney.com)、[Github](http://github.com/)、[Hulu](http://hulu.com/)、[Kickstarter](http://kickstarter.com/)、[Shopify](http://shopify.com/)、[Twitter](http://twitter.com/) 和 [Yellow Pages](http://yellowpages.com/)。還有很多 Web 開發工作室專門從事 Rails 應用開發,例如 [ENTP](http://entp.com/)、[thoughtbot](http://thoughtbot.com/)、[Pivotal Labs](http://pivotallabs.com/)、[Hashrocket](http://hashrocket.com/) 和 [HappyFunCorp](http://www.happyfuncorp.com/)。除此之外還有無數獨立顧問,培訓人員和項目承包商。
Rails 為何如此成功呢?首先,Rails 完全開源,基于 [MIT 協議](http://www.opensource.org/licenses/mit-license.php)發布,可以免費下載、使用。Rails 的成功很大程度上得益于它優雅而緊湊的設計。Rails 熟諳 Ruby 語言的可擴展性,開發了一套用于編寫 Web 應用的“[領域特定語言](http://en.wikipedia.org/wiki/Domain_Specific_Language)”(Domain-specific Language,簡稱 DSL)。所以 Web 編程中很多常見的任務,例如生成 HTML,創建數據模型和 URL 路由,在 Rails 中都很容易實現,最終得到的應用代碼簡潔而且可讀性高。
Rails 還會快速跟進 Web 開發領域最新的技術和框架設計方式。例如,Rails 是最早使用 REST 架構風格組織 Web 應用的框架之一(這個架構貫穿本書)。當其他框架開發出成功的新技術后,Rails 的創建者 [David Heinemeier Hansson](http://loudthinking.com/) 及其[核心開發團隊](http://rubyonrails.org/core)會毫不猶豫的將其吸納進來。或許最典型的例子是 Rails 和 Merb 兩個項目的合并,從此 Rails 繼承了 Merb 的模塊化設計、穩定的 [API](http://en.wikipedia.org/wiki/Application_programming_interface),性能也得到了提升。
最后一點,Rails 有一個活躍而多元化的社區。社區中有數以百計的開源項目[貢獻者](http://contributors.rubyonrails.org/),以及與會者眾多的[開發者大會](http://railsconf.com/),而且還開發了大量的 [gem](https://rubygems.org/)(代碼庫,一個 gem 解決一個特定的問題,例如分頁和圖片上傳),有很多內容豐富的博客,以及一些討論組和 IRC 頻道。有如此眾多的 Rails 程序員也使得處理程序錯誤變得簡單了:在谷歌中搜索錯誤消息,幾乎總能找到一篇相關的博客文章或討論組中的話題。
## 1.1.1 預備知識
閱讀本書不需要具備特定的預備知識。本書不僅介紹 Rails,還涉及底層的 Ruby 語言,Rails 默認使用的測試框架(MiniTest),Unix 命令行,[HTML](http://en.wikipedia.org/wiki/HTML)、[CSS](http://en.wikipedia.org/wiki/CSS),少量的 [JavaScript](http://en.wikipedia.org/wiki/JavaScript),以及一點 [SQL](http://en.wikipedia.org/wiki/SQL)。我們要掌握的知識很多,所以我一般建議閱讀本書之前先具備一些 HTML 和編程知識。說是這么說,但也有相當數量的初學者使用本書從零開始學習 Web 開發,所以即便你的經驗有限,我還是建議你讀一下試試。如果你招架不住了,隨時可以翻回這里,使用下面列出的某個資源,從頭學起。多位讀者告訴我,他們建議跟著教程做兩遍,第一遍畢竟學到的知識有限,但再做第二遍就簡單多了。
學習 Rails 時經常有人問,要不要先學 Ruby。這個問題的答案取決于你個人的學習方式以及編程經驗。如果你希望較為系統地徹底學習,或者你以前從未編程過,那么先學 Ruby 或許更合適。學習 Ruby,我推薦閱讀 Chris Pine 寫的《[Learn to Program](http://pragprog.com/book/ltp2/learn-to-program)》和 Peter Cooper 寫的《[Ruby 入門](http://book.douban.com/subject/3836123/)》。很多 Rails 初學者很想立即開始開發 Web 應用,而不是在此之前讀完一本介紹 Ruby 的書。如果你是這類人,我推薦你在 [Try Ruby](http://tryruby.org/) 上學習一些簡短的交互式教程,以便在閱讀本書之前對 Ruby 有個大概的了解。如果你還是覺得本書太難,或許可以先看 Daniel Kehoe 寫的《[Learn Ruby on Rails](http://learn-rails.com/learn-ruby-on-rails.html)》,或者學習 [One Month Rails](https://onemonth.com) 課程——它們更適合沒有任何背景知識的初學者。
不管你從哪里開始,讀完本書后都應該可以學習 Rails 中高級知識了。以下是我推薦的一些學習資源:
* [Code School](http://www.codeschool.com/):很好的交互式編程課程;
* [Tealeaf Academy](http://www.gotealeaf.com/railstutorial):很好的在線 Rails 開發訓練營(包含高級知識);
* [Thinkful](http://www.thinkful.com/a/railstutorial):在線課程,和本書的難度差不多;
* Ryan Bates 主持的 [RailsCasts](http://railscasts.com/):優秀的 Rails 視頻(大多數免費);
* [RailsApps](https://tutorials.railsapps.org/hartl):很多針對特定話題的 Rails 項目和教程,說明詳細;
* [Rails 指南](http://guides.rubyonrails.org/):按話題編寫的 Rails 參考,經常更新。[[3](#fn-3)]
## 1.1.2 排版約定
本書使用的排版方式,很多都不用再做解釋。本節我要說一下那些意義不是很清晰的排版。
書中很多代碼清單用到了命令行命令。為了行文簡便,所有命令都使用 Unix 風格命令行提示符(一個美元符號),例如:
```
$ echo "hello, world!"
hello, world!
```
在 [1.2 節](#up-and-running)我會提到,不管你使用哪種操作系統(尤其是 Windows),我都建議使用云端開發環境([1.2.1 節](#development-environment)),這種環境都內置了 Unix(Linux)命令行。命令行十分有用,因為 Rails 提供了很多可以在命令行中運行的命令。例如,在 [1.3.2 節](#rails-server)中,我們會使用 `rails server` 命令啟動本地的 Web 開發服務器:
```
$ rails server
```
和命令行提示符一樣,本書也會使用 Unix 慣用的目錄分隔符(即斜線 `/`)。例如,演示應用中的配置文件 `production.rb`,它的路徑是:
```
config/environments/production.rb
```
這個文件路徑相對于應用的根目錄。在不同的系統中,根目錄會有差別。在云端 IDE 中,根目錄像下面這樣:
```
/home/ubuntu/workspace/sample_app/
```
所以,`production.rb` 的完整路徑是:
```
/home/ubuntu/workspace/sample_app/config/environments/production.rb
```
為了行文簡潔,我一般都會省略應用的路徑,寫成 `config/environments/production.rb`。
本書經常需要顯示一些來自其他程序(shell 命令,版本控制系統,Ruby 程序等)的輸出。因為系統之間存在細微的差異,你看到的輸出結果可能和書中顯示的不完全一致,但是無需擔心。而且,有些命令在某些操作系統中可能會導致錯誤,本書不會一一說明這些錯誤的解決方法,你可以在谷歌中搜索錯誤消息,自己嘗試解決——這也是為現實中的軟件開發做準備。如果你在閱讀本書的過程中遇到了問題,我建議你看一下[本書網站幫助區](http://railstutorial.org#help)中列出的資源。
在這個教程中我們要測試 Rails 應用,所以最好知道某段代碼能讓測試組件失敗(使用紅色表示)還是通過(使用綠色表示)。為了方便,導致測試失敗的代碼使用“**RED**”標記,能讓測試通過的代碼使用“**GREEN**”標記。
每一章都有一些練習,你可以自己決定要不要做,但推薦做。為了區分正文和練習,練習的解答不會和后續的內容混在一起。如果后面需要使用某個練習中的代碼,我會在正文中指出來,并給出解答方法。
最后,為了方便,本書使用兩種排版方式,讓代碼清單更易理解。第一種,有些代碼清單中包含一到多個高亮的代碼行,如下所示:
```
class User < ActiveRecord::Base
validates :name, presence: true
validates :email, presence: true end
```
高亮的代碼行一般用于標出這段代碼清單中最重要的新代碼,偶爾也用來表示當前代碼清單和前一個代碼清單的差異。第二種,為了行文簡潔,書中很多代碼清單中都有豎排的點號,如下所示:
```
class User < ActiveRecord::Base
.
.
.
has_secure_password
end
```
這些點號表示省略的代碼,不要直接復制。
- Ruby on Rails 教程
- 致中國讀者
- 序
- 致謝
- 作者譯者簡介
- 版權和代碼授權協議
- 第 1 章 從零開始,完成一次部署
- 1.1 簡介
- 1.2 搭建環境
- 1.3 第一個應用
- 1.4 使用 Git 做版本控制
- 1.5 部署
- 1.6 小結
- 1.7 練習
- 第 2 章 玩具應用
- 2.1 規劃應用
- 2.2 用戶資源
- 2.3 微博資源
- 2.4 小結
- 2.5 練習
- 第 3 章 基本靜態的頁面
- 3.1 創建演示應用
- 3.2 靜態頁面
- 3.3 開始測試
- 3.4 有點動態內容的頁面
- 3.5 小結
- 3.6 練習
- 3.7 高級測試技術
- 第 4 章 Rails 背后的 Ruby
- 4.1 導言
- 4.2 字符串和方法
- 4.3 其他數據類型
- 4.4 Ruby 類
- 4.5 小結
- 4.6 練習
- 第 5 章 完善布局
- 5.1 添加一些結構
- 5.2 Sass 和 Asset Pipeline
- 5.3 布局中的鏈接
- 5.4 用戶注冊:第一步
- 5.5 小結
- 5.6 練習
- 第 6 章 用戶模型
- 6.1 用戶模型
- 6.2 用戶數據驗證
- 6.3 添加安全密碼
- 6.4 小結
- 6.5 練習
- 第 7 章 注冊
- 7.1 顯示用戶的信息
- 7.2 注冊表單
- 7.3 注冊失敗
- 7.4 注冊成功
- 7.5 專業部署方案
- 7.6 小結
- 7.7 練習
- 第 8 章 登錄和退出
- 8.1 會話
- 8.2 登錄
- 8.3 退出
- 8.4 記住我
- 8.5 小結
- 8.6 練習
- 第 9 章 更新,顯示和刪除用戶
- 9.1 更新用戶
- 9.2 權限系統
- 9.3 列出所有用戶
- 9.4 刪除用戶
- 9.5 小結
- 9.6 練習
- 第 10 章 賬戶激活和密碼重設
- 10.1 賬戶激活
- 10.2 密碼重設
- 10.3 在生產環境中發送郵件
- 10.4 小結
- 10.5 練習
- 10.6 證明超時失效的比較算式
- 第 11 章 用戶的微博
- 11.1 微博模型
- 11.2 顯示微博
- 11.3 微博相關的操作
- 11.4 微博中的圖片
- 11.5 小結
- 11.6 練習
- 第 12 章 關注用戶
- 12.1 “關系”模型
- 12.2 關注用戶的網頁界面
- 12.3 動態流
- 12.4 小結
- 12.5 練習