💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 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 ``` 这些点号表示省略的代码,不要直接复制。