1.1 简介

Ruby on Rails(或者简称“Rails”)是一个 Web 开发框架,使用 Ruby 编程语言开发。自 2004 年出现之后,Rails 就迅速成为动态 Web 应用开发领域功能最强大、最受欢迎的框架之一。使用 Rails 的公司有很多,例如 AirbnbBasecampDisneyGithubHuluKickstarterShopifyTwitterYellow Pages。还有很多 Web 开发工作室专门从事 Rails 应用开发,例如 ENTPthoughtbotPivotal LabsHashrocketHappyFunCorp。除此之外还有无数独立顾问,培训人员和项目承包商。

Rails 为何如此成功呢?首先,Rails 完全开源,基于 MIT 协议发布,可以免费下载、使用。Rails 的成功很大程度上得益于它优雅而紧凑的设计。Rails 熟谙 Ruby 语言的可扩展性,开发了一套用于编写 Web 应用的“领域特定语言”(Domain-specific Language,简称 DSL)。所以 Web 编程中很多常见的任务,例如生成 HTML,创建数据模型和 URL 路由,在 Rails 中都很容易实现,最终得到的应用代码简洁而且可读性高。

Rails 还会快速跟进 Web 开发领域最新的技术和框架设计方式。例如,Rails 是最早使用 REST 架构风格组织 Web 应用的框架之一(这个架构贯穿本书)。当其他框架开发出成功的新技术后,Rails 的创建者 David Heinemeier Hansson 及其核心开发团队会毫不犹豫的将其吸纳进来。或许最典型的例子是 Rails 和 Merb 两个项目的合并,从此 Rails 继承了 Merb 的模块化设计、稳定的 API,性能也得到了提升。

最后一点,Rails 有一个活跃而多元化的社区。社区中有数以百计的开源项目贡献者,以及与会者众多的开发者大会,而且还开发了大量的 gem(代码库,一个 gem 解决一个特定的问题,例如分页和图片上传),有很多内容丰富的博客,以及一些讨论组和 IRC 频道。有如此众多的 Rails 程序员也使得处理程序错误变得简单了:在谷歌中搜索错误消息,几乎总能找到一篇相关的博客文章或讨论组中的话题。

1.1.1 预备知识

阅读本书不需要具备特定的预备知识。本书不仅介绍 Rails,还涉及底层的 Ruby 语言,Rails 默认使用的测试框架(MiniTest),Unix 命令行,HTMLCSS,少量的 JavaScript,以及一点 SQL。我们要掌握的知识很多,所以我一般建议阅读本书之前先具备一些 HTML 和编程知识。说是这么说,但也有相当数量的初学者使用本书从零开始学习 Web 开发,所以即便你的经验有限,我还是建议你读一下试试。如果你招架不住了,随时可以翻回这里,使用下面列出的某个资源,从头学起。多位读者告诉我,他们建议跟着教程做两遍,第一遍毕竟学到的知识有限,但再做第二遍就简单多了。

学习 Rails 时经常有人问,要不要先学 Ruby。这个问题的答案取决于你个人的学习方式以及编程经验。如果你希望较为系统地彻底学习,或者你以前从未编程过,那么先学 Ruby 或许更合适。学习 Ruby,我推荐阅读 Chris Pine 写的《Learn to Program》和 Peter Cooper 写的《Ruby 入门》。很多 Rails 初学者很想立即开始开发 Web 应用,而不是在此之前读完一本介绍 Ruby 的书。如果你是这类人,我推荐你在 Try Ruby 上学习一些简短的交互式教程,以便在阅读本书之前对 Ruby 有个大概的了解。如果你还是觉得本书太难,或许可以先看 Daniel Kehoe 写的《Learn Ruby on Rails》,或者学习 One Month Rails 课程——它们更适合没有任何背景知识的初学者。

不管你从哪里开始,读完本书后都应该可以学习 Rails 中高级知识了。以下是我推荐的一些学习资源:

  • Code School:很好的交互式编程课程;

  • Tealeaf Academy:很好的在线 Rails 开发训练营(包含高级知识);

  • Thinkful:在线课程,和本书的难度差不多;

  • Ryan Bates 主持的 RailsCasts:优秀的 Rails 视频(大多数免费);

  • RailsApps:很多针对特定话题的 Rails 项目和教程,说明详细;

  • Rails 指南:按话题编写的 Rails 参考,经常更新。[3]

1.1.2 排版约定

本书使用的排版方式,很多都不用再做解释。本节我要说一下那些意义不是很清晰的排版。

书中很多代码清单用到了命令行命令。为了行文简便,所有命令都使用 Unix 风格命令行提示符(一个美元符号),例如:

$ echo "hello, world!"
hello, world!

1.2 节我会提到,不管你使用哪种操作系统(尤其是 Windows),我都建议使用云端开发环境(1.2.1 节),这种环境都内置了 Unix(Linux)命令行。命令行十分有用,因为 Rails 提供了很多可以在命令行中运行的命令。例如,在 1.3.2 节中,我们会使用 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 程序等)的输出。因为系统之间存在细微的差异,你看到的输出结果可能和书中显示的不完全一致,但是无需担心。而且,有些命令在某些操作系统中可能会导致错误,本书不会一一说明这些错误的解决方法,你可以在谷歌中搜索错误消息,自己尝试解决——这也是为现实中的软件开发做准备。如果你在阅读本书的过程中遇到了问题,我建议你看一下本书网站帮助区中列出的资源。

在这个教程中我们要测试 Rails 应用,所以最好知道某段代码能让测试组件失败(使用红色表示)还是通过(使用绿色表示)。为了方便,导致测试失败的代码使用“RED”标记,能让测试通过的代码使用“GREEN”标记。

每一章都有一些练习,你可以自己决定要不要做,但推荐做。为了区分正文和练习,练习的解答不会和后续的内容混在一起。如果后面需要使用某个练习中的代码,我会在正文中指出来,并给出解答方法。

最后,为了方便,本书使用两种排版方式,让代码清单更易理解。第一种,有些代码清单中包含一到多个高亮的代码行,如下所示:

class User < ActiveRecord::Base
  validates :name,  presence: true
 validates :email, presence: true end

高亮的代码行一般用于标出这段代码清单中最重要的新代码,偶尔也用来表示当前代码清单和前一个代码清单的差异。第二种,为了行文简洁,书中很多代码清单中都有竖排的点号,如下所示:

class User < ActiveRecord::Base
  .
  .
  .
  has_secure_password
end

这些点号表示省略的代码,不要直接复制。