# 第 1 章 從零開始,完成一次部署
歡迎閱讀《Ruby on Rails 教程:通過 Rails 學習 Web 開發》。本書的目的是教你如何開發 Web 應用,而我們選擇的工具是流行的 [Ruby on Rails](http://rubyonrails.org) Web 框架。如果你剛接觸這一領域,本書會向你詳細介紹 Web 應用開發的方方面面,包括 Ruby、Rails、HTML 和 CSS、數據庫、版本控制、測試,以及部署的基本知識。學會這些知識足夠為你贏得一份 Web 開發者的工作,或者還可以讓你成為一名技術創業者。如果你已經了解 Web 開發,閱讀本書能快速學會 Rails 框架的基礎,包括 MVC 和 REST、生成器、遷移、路由,以及嵌入式 Ruby。不管怎樣,讀完本書之后,以你所掌握的知識,已經能夠閱讀討論更高級話題的圖書和博客,或者觀看視頻。這些都是旺盛的編程教學生態圈的一部分。[[1](#fn-1)]
本書采用一種綜合式方法講授 Web 開發,在學習的過程中我們要開發三個演示應用:第一個最簡單,叫 `hello_app`([1.3 節](#the-first-application));第二個功能多一些,叫 `toy_app`([第 2 章](chapter2.html#a-toy-app)),第三個是真正的演示程序,叫 `sample_app`([第 3 章](chapter3.html#mostly-static-pages)到[第 12 章](chapter12.html#following-users))。從這三個應用的名字可以看出,書中開發的應用不限定于某種特定類型的網站。不過,最后一個演示應用有點兒類似某個流行的[社會化微博網站](https://twitter.com)(很巧,這個網站一開始也是使用 Rails 開發的)。本書的重點是介紹通用原則,所以不管你想開發什么樣的 Web 應用,讀完本書后,都能建立扎實的基礎。
人們經常會問,我要具備多少背景知識才能閱讀本書學習 Web 開發。[1.1.1 節](#prerequisites)對此做了詳細分析。Web 開發是個具有挑戰性的學科,對沒有任何背景知識的初學者來說挑戰更大。我最初為本書設定的閱讀對象是已經具有一定編程和 Web 開發經驗的開發者,但后來發現讀者中有很多都剛開始接觸開發。所以,現在你看到的本書第三版做出了很多努力,盡量降低了入門 Rails 的門檻。
##### 旁注 1.1:降低門檻
本書第三版采取了很多措施,降低入門 Rails 的門檻:
* 使用云端標準的開發環境([1.2 節](#up-and-running)),規避了安裝和配置新系統涉及到的很多問題;
* 合理利用 Rails 默認提供的組件,例如原生的 MiniTest 測試框架;
* 刪掉了很多外部依賴件(RSpec,Cucumber,Capybara,Factory Girl);
* 使用一種更輕量級、更靈活的測試方式;
* 延后介紹,或者刪除了較為復雜的配置選項(Guard,Spork,RubyTest);
* 弱化某個 Rails 版本特有的功能,更加強調 Web 開發的通用原則。
我希望這些變化能讓本書第三版獲得比前一版更多的讀者。
這第一章,我們要安裝 Ruby on Rails 以及需要的所有軟件,而且還要架設開發環境([1.2 節](#up-and-running))。然后創建第一個 Rails 應用,`hello_app`。本書旨在介紹優秀的軟件開發習慣,所以在創建第一個應用之后,我們會立即將它納入版本控制系統 Git 中([1.4 節](#version-control-with-git))。你可能不相信,在這一章,我們還要部署這個應用([1.5 節](#deploying)),把它放到外網上。
[第 2 章](chapter2.html#a-toy-app)會創建第二個項目,演示 Rails 應用的一些基本操作。為了速度,我們會使用腳手架([旁注 1.2](#aside-scaffolding))創建這個應用(名為 `toy_app`)。因為生成的代碼很丑也很復雜,所以[第 2 章](chapter2.html#a-toy-app)將集中精力在瀏覽器中,使用 URI(經常稱為 URL)[[2](#fn-2)]和這個應用交互。
本書剩下的章節將集中精力開發一個真實的大型演示應用(名為 `sample_app`),所有代碼都從零開始編寫。在開發這個應用的過程中,我們會用到模擬技術,“測試驅動開發”(Test-driven Development,簡稱 TDD)理念,以及“集成測試”(integration test)。[第 3 章](chapter3.html#mostly-static-pages)創建靜態頁面,然后增加一些動態內容。[第 4 章](chapter4.html#rails-flavored-ruby)會簡要介紹一下 Rails 使用的 Ruby 程序語言。[第 5 章](chapter5.html#filling-in-the-layout)到[第 10 章](chapter10.html#account-activation-and-password-reset)將逐步完善這個應用的低層結構,包括網站的布局,用戶數據模型,完整的注冊和認證系統(含有賬戶激活和密碼重設功能)。最后,[第 11 章](chapter11.html#user-microposts)和[第 12 章](chapter12.html#following-users)將添加微博和社交功能,最終開發出一個可以正常運行的演示網站。
##### 旁注 1.2:腳手架——更快,更簡單,更誘人
Rails 出現伊始就吸引了眾多目光,特別是 Rails 創始人 David Heinemeier Hansson 錄制的著名的“[15分鐘開發一個博客程序](http://v.youku.com/v_show/id_XNzg5MjUwOTU2.html)”視頻。這個視頻及其衍生版本是窺探 Rails 強大功能一種很好的方式,我推薦你看一下這些視頻。不過事先提醒一下,這些視頻中的演示能控制在 15 分鐘以內,得益于一種叫做“腳手架”(scaffold)的功能,通過 Rails 命令 `generate scaffold` 生成大量的代碼。
寫作本書時,我也想過使用腳手架,因為它[更快、更簡單、更誘人](http://en.wikipedia.org/wiki/Dark_side_(Star_Wars))。不過腳手架生成的大量且復雜的代碼會讓初學者困惑。雖然能學會腳手架的用法,但并不明白到底發生了什么事。使用腳手架,你只是一個腳本生成器的使用者,無法提升你對 Rails 的認識。
本書將采用一種不同的方式,雖然[第 2 章](chapter2.html#a-toy-app)會用腳手架開發一個小型的玩具應用,但本書的核心是從[第 3 章](chapter3.html#mostly-static-pages)起開發的演示應用。在開發這個演示應用的每個階段,我們只會編寫少量的代碼,易于理解但又具有一定的挑戰性。通過這一過程,最終你會對 Rails 有較為深刻的理解,而且能靈活運用,開發幾乎任何類型的 Web 應用。
- 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 練習