# 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 练习