版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第1章 简介11.1 Rails是敏捷的21.2 读你所需31.3 致谢5第2章 Rails应用的架构92.1 模型,视图,以及控制器92.2 Active Record:Rails的模型支持112.3 Action Pack:视图与控制器14第3章 安装Rails173.1 购物清单173.2 Windows上的安装173.3 Mac OS X上的安装193.4 Linux上的安装203.5 Rails版本选择203.6 开发环境213.7 Rails和数据库243.8 保持更新253.9 Rails和ISPs26第4章 立竿见影274.1 新建一个应用程序274.2 Hello, Rail
2、s284.3 把页面连起来374.4 我们做了什么39第5章 Depot应用程序435.1 增量式开发435.2 Depot做些什么445.3 我们编码吧47第6章 任务A:货品维护476.1 迭代A1:跑起来再说486.2 创建货品模型和维护应用526.3 迭代A2:添加缺失的字段556.4 迭代A3:检查一下606.5 迭代A4:更美观的列表页63第7章 任务B:分类显示677.1 迭代B1:创建分类列表687.2 迭代B2:添加页面布局707.3 迭代B3:用辅助方法格式化价格727.4 迭代B4:链接到购物车73第8章 任务C:创建购物车758.1 事务758.2 迭代C1:创建购物车
3、788.3 迭代C2:创建更聪明的购物车818.4 迭代C3:处理错误848.5 迭代C4:结束购物车87第9章 任务D:Ajax初体验909.1 迭代Dl:迁移购物车919.2 迭代D2:创建基于Ajax的购物车949.3 迭代D3:高亮显示变化979.4 迭代D4:隐藏空购物车999.5 迭代D5:JavaScript被禁用时的对策1019.6 我们做了什么102第10章 任务E:付账10510.1 迭代E1:收集订单信息105第11章 任务F:管理11711.1 迭代F1:添加用户11711.2 迭代F2:登录12311.3 迭代F3:访问控制12611.4 迭代F4:增加边栏,以及更多
4、的管理功能128第12章 任务G:最后一点小改动13512.1 生成XML13512.2 扫尾工作143第13章 任务I: 国际化14513.1 迭代I1: 启用翻译14513.2 迭代 I2: Exploring Strategies for Content155第14章 任务T: 测试15714.1 加上测试15714.2 模型的单元测试15814.3 控制器的功能测试16714.4 应用程序的集成测试17814.5 性能测试18414.6 使用Mock对象187第15章 深入Rails19115.1 Rails在哪儿19115.2 目录结构19115.3 Rails配置19715.4 命
5、名约定19915.5 Rails的日志20215.6 调试信息20215.7 精彩预告203第16章 Active Support20516.1 通用扩展20516.2 枚举和数组20616.3 Hashes20716.4 字符串扩展20816.5 数值的扩展21016.6 时间和日期的扩展21016.7 Ruby符号的扩展21216.8 with_options21216.9 Unicode支持213第17章 数据迁移21717.1 创建和运行迁移任务21817.2 剖析迁移任务22017.3 表的管理22317.4 数据迁移任务22617.5 高级迁移任务22817.6 迁移任务的缺点23
6、117.7 在迁移任务之外操作数据库结构23217.8 管理迁移任务233第18章 ActiveRecord第一部分:基础23518.1 表和类23518.2 字段和属性23618.3 主键与id23918.4 连接数据库24018.5 CRUD24518.6 聚合与结构化数据25818.7 杂录263第19章 ActiveRecord第二部分:表间关联26719.1 创建外键26819.2 在模型对象中指定关联26919.3 belongs_to和has_xxx声明27119.4 连接多张表28219.5 自引用的连接28919.6 Acts AS29019.7 何时保存29319.8 预先
7、读取子记录294第20章 ActiveRecord第三部分:对象生命周期29720.1 校验29720.2 回调30420.3 高级属性31020.4 事务312第21章 ActiveController:路由与URL31921.1 基础31921.2 请求的路由32021.3 基于资源的路由33021.4 路由的测试343第22章 ActionController和Rails34522.1 Action方法34522.2 Cookie和Session35322.3 FlashAction之间的通信36322.4 过滤器与校验36422.5 缓存初接触37022.6 GET请求的问题377第2
8、3章 Action View37923.1 模板37923.2 使用辅助方法38323.3 用于格式化、链接和分页的辅助方法38423.4 如何使用表单39023.5 包装模型对象的表单39123.6 自制表单构建器40023.7 处理与模型对象无关的字段40423.8 Rails应用的文件上传40623.9 布局与组件40923.10 再论缓存41423.11 新增模板系统418第24章 Web 2.042124.1 Prototype42124.2 Script.aculo.us43624.3 RJS模板44824.4 结论453第25章 ActionMailer45525.1 发送邮件4
9、5525.2 接收邮件46325.3 电子邮件的测试464第26章 Active Resources46726.1 Active Resource的替代方法46726.2 让我看看代码吧46926.3 关系和集合47126.4 把它们放在一起473第27章 保护Rails应用47827.1 SQL注入47827.2 用参数直接创建记录48027.3 不要相信id参数48127.4 不要暴露控制器方法48227.5 跨站点脚本(CSS/XSS)48227.6 防御session定置攻击48427.7 文件上传48527.8 不要以明文保存敏感信息48627.9 用SSL传输敏感信息48627.1
10、0 不要缓存需要身份认证的页面48727.11 知己知彼488第28章 部署与生产48928.1 尽早开始48928.2 生产服务器如何工作49028.3 安装Passenger49128.3 使用Capistrano进行无忧部署49328.5 检查已部署的应用程序49628.6 投入生产运行之后的琐事49728.7 上线,并不断前进499附录A Ruby简介505A.1 Ruby是一种面向对象的语言505A.2 Ruby中的名称506A.3 方法506A.4 类508A.5 模块510A.6 数组与hash510A.7 控制结构511A.8 正则表达式512A.9 代码块与迭代器512A.1
11、0 异常513A.11 对象序列化513A.12 交互式的Ruby514A.13 Ruby惯用法514A.14 RDOC文档515附录B 配置参数517B.1 顶级配置517B.2 ActiveRecord配置519B.3 ActionController配置520B.4 ActionView配置521B.5 ActionMailer配置522B.6 TestCase配置523附录C 源代码525C.1 完整的Depot应用525附录D 资源555D.1 在线资源555D.2 参考书目555第1章简介Introduction Ruby on Rails是一个框架,一个使Web应用的开发、部署和
12、维护变得更容易的框架。自从发布第一个版本以来,Rails已经从一个默默无闻的玩具蜕变成了一种世界性的现象。它拿下了一个又一个的奖项,更重要的是,很多web2.0应用都选择它作为基础框架。Rails已经不再只是一小撮黑客推崇的时髦玩艺:很多跨国公司正在用它来开发自己的web应用。为什么会这样?有几个方面的原因。首先,很多开发者已经对自己开发Web应用所使用的技术深感厌倦。不管使用Java、PHP还是NET,越来越多的开发者开始深切地感到:这些东西实在难用得要死。就在此时,Rails从天而降,而且它要简单得多。光有简单是不够的。这些人都是专业的软件开发者,他们编写的是真实的网站应用,他们希望自己的
13、产品经得起时间的检验,所以他们总是选择先进而专业的技术。这些开发者们深入研究了Rails,并发现它不仅仅是一个快速开发网站的工具。譬如说,所有的Rails应用都采用了“模型-视图-控制器”(Model-View-Controller, MVC)架构。Java开发者都很熟悉MVC框架,例如Tapestry和struts。但Rails把MVC贯彻得更彻底:当你用Rails开发时,每一块代码该放在什么地方都有一定之规,代码之间都按照规定的方式进行交互。从一开始,Rails就已经帮你准备好了应用程序的骨架。专业的程序员总是给自己的代码编写测试。同样,Rails也提供了这方面的支持。所有的Rails应用
14、都天生内建了对测试的支持。当你开始增加功能时,Rails就会自动帮你创建针对这项新功能的测试存根(stub)。Rails框架让应用程序的测试变得更容易,因此,Rails应用也更能够得到充分的测试。Rails应用是用Ruby编写的,这是一种现代的面向对象脚本语言。Ruby很简洁,却又不致简练得难以理解。使用Ruby,你可以自然而清晰地表述自己的想法,因此,Ruby程序很容易编写,而且放上几个月之后也很容易读懂这是非常重要的。Rails给Ruby加上了一些限制,又进行了一些独具匠心的扩展,使得在其中编程更加容易,也让我们的程序更短小、更易读,并且让我们能够在代码中完成一些通常需要用上外部配置文件才
15、能完成的任务。这样一来,我们可以更轻松地看懂其中的逻辑。譬如说,下面的代码定义了一个项目中的模型类。现在你不必操心其中的细节,只要注意在这短短几行代码中描述了多少信息即可。class Project :milestones validates_presence_of :name, :description validates_acceptance_of :non_disclosure_agreement validates_uniqueness_of :short_nameend开发者们还会在Rails中发现另一件事:这个框架的背后有一套完整的哲学支撑。Rails的设计始终遵循两个核心原则:D
16、RY和惯例重于配置(convention over configuration)。DRY也就是不要重复你自己(Dont Repeat Yourself)的缩写:系统中的每项知识只应该在一个地方描述。借助Ruby的强大威力,Rails实现了这一目标。在Rails应用程序中,你几乎不会看到重复的代码,每件事情都只需要说一遍你只要在符合MVC架构惯例的某个地方说一遍,以后就不必再重复了。用惯其他web框架的程序员大多有这样的经历:只要对数据库结构做一点点修改,就必须同时修改好几处代码。对他们而言,DRY的哲学不啻是一大福音。惯例重于配置也同样重要。对于“如何将应用程序组装起来”这件事,Rails自有
17、一套默认的规则相当有道理的一套规则。只要遵循命名惯例,编写一个Rails应用程序所需的代码量比起典型的、使用XML配置的Java web应用要少得多。如果你不想遵循这些惯例,在Rails中也很简单。开发者们还会在Rails中发现别的惊喜。Rails是一个新生框架,它的核心开发团队了解新的Web业务模式。 Rails不会亦步亦趋地紧跟新近出现的web标准:它本身就在web标准的制订中起着重要的作用。此外,Rails也让开发者们能够更轻松地将Ajax和RESTful接口之类的新技术整合到自己的应用中它内建了对这些技术的支持(如果你还不熟悉Ajax和REST接口,别担心,我们会在本书中介绍它们)。开
18、发者们还需要考虑应用的部署问题。使用Rails,你只需要输入一条命令,就可以将应用程序的最新版本部署到任意多台服务器上(如果发现最新版本不好用,撤销部署也同样容易)。Rails是从一个真实的商用程序中抽取而成的。要创造一个框架,最好的办法也许就是:首先找出一类特定应用的核心场景,然后逐渐从中抽取出通用的代码基础。其结果是,当开发Rails应用程序时,你会发现:在你开始动手编写任何一行代码之前,一个出色的应用程序已经有一半在你手上了。当然,Rails还有别的好处有些甚至很难言传。总之,Rails就是让人感觉很爽。当然了,正所谓百闻不如一见,听我们说的再多,也不如让你自己动手写一点Rails的应用
19、程序(这大概是下一个45分钟的任务)。这也就是我们这本书的目标所在。1.1 Rails是敏捷的Rails Is Agile既然本书的名字叫作Agile Web Development with Rails,你可能会感到奇怪:为什么书里没有关于“在Rails中运用某某敏捷实践”这样的章节。原因很简单:敏捷是Rails的基础所在。我们来看看“敏捷宣言” /。Dave Thomas是这份文本的17位作者之一所描述的价值观,这段简短的文本描述出了敏捷开发者的选择。l 人和交互重于过程和工具。l 可以工作的软件重于求全责备的文档。l 与客户合作重于
20、合同谈判。l 随时应对变化重于循规蹈矩。Rails非常强调人和交互。这里没有繁重的工具,没有复杂的配置,没有冗长的过程。这里只有开发者组成的小组、他们最爱的编辑器,以及Ruby代码。于是,开发的透明度更高:开发者所做的工作能够立即让客户看到。这是一个天生的交互式过程。Rails并不打算废弃所有文档,而是使你可以毫不费劲地为所有代码生成HTML格式的文档。但Rails的开发过程并不由文档驱动。在一个Rails项目的核心地带,你不会找到一份500页的规约说明书,只会看见一组用户和开发者共同发掘需求、寻找实现需求的办法。你会发现,随着开发者和用户对试图解决的问题越来越了解,解决方案也会不断变化。你会
21、发现,这个团队在开发循环的初期就开始交付可以工作的软件。这个软件的细节可能很粗糙,但它让用户可以亲身体验你所交付的东西。因此,Rails也鼓励着用户与开发团队合作。一旦看到Rails项目能够以如此之快的速度响应变化,客户就会开始相信开发团队能够交付自己真正需要的东西,而不仅仅是自己所要求的东西。客户与开发团队之间的对抗将被建设性的讨论取代。说到底,这些都要归结到“响应变化”。Rails强烈要求甚至可以说是强迫遵循DRY原则,这就意味着一旦变化来临,Rails应用需要修改的代码量比用其他框架开发的应用要少得多。而且,由于Rails应用是用Ruby编写的,而Ruby又能够准确、简练地描述程序概念,
22、因此,变化也更加容易被限制在一个小模块内部,并且代码修改也更容易。对单元测试和功能测试的强烈重视,以及对测试套件和mock对象的支持,又给了开发者一张可靠的安全网,这是进行修改时不可或缺的。有了一组完善的测试作为保障,开发者们将更有勇气面对变化。所以,我们觉得,与其想方设法地把Rails应用的开发过程跟敏捷原则扯上关系,还不如让Rails框架自己来讲述这些原则。当阅读本书的“实例教学”部分内容时,请想象你自己正在用这种方式开发web应用:跟客户坐在一起工作,共同决定每个问题的优先级,然后共同为每个问题找到解决办法。然后,当读到后面的“深入参考”部分内容时,再考虑Rails的结构能够怎样帮助你更
23、快地满足用户需求。最后一点关于敏捷和Rails的提示:虽然这听起来有点不太专业,不过,请留意在Rails中编写代码有多么愉快。1.2 读你所需Finding Your Way Around本书的前两部分将介绍Rails背后的概念,并提供一个不算太小的范例我们将一起构造一个简单的在线商店系统。如果你希望亲身体验一下Rails编程的感觉,这是一个不错的起点。实际上,大多数读者似乎乐于一边读书一边亲手构造这个示例应用。如果你懒得敲键盘,也可以直接下载源代码(提供压缩的tar文件包和zip压缩包两种格式)。 下载地址:/titles/rails3/code.
24、html。本书的第3部分则会详细介绍Rails的诸多功能。如果你想弄清一个组件怎么用、如何高效而安全地部署Rails应用,就请阅读这一部分。在阅读的过程中,你会看到下列约定形式:真实代码本书中展示的代码片段大多来自真实运行的示例应用,你可以下载完整的应用程序。为了帮助读者理解,如果一段代码能够在下载的应用中找到,在代码的上边就会有一个路径指明它所在的文件,就像这样:Download work/demo1/app/controllers/say_controller.rb class SayController name=dave.each do |order| puts order.amoun
25、tend最后,每个对象会有一些方法,用于操作自己所对应的那条记录。其中用得最多的方法大概就是save(),这个方法用于将对象中的数据保存回数据库:Order.find(:all, :conditions = name=dave).each do |order| order.discount=0.5 order.saveend综上所述,ORM层将数据库表映射到类、将记录映射到对象、将字段映射到对象的属性。类方法用于执行表级别的操作,实例方法则用于执行针对单条记录的操作。在一个典型的ORM库中,你可以提供配置数据来指定数据库端与应用程序端之间的映射关系。使用这些ORM工具的程序员常常会发现:他们不
26、得不忙于创建和维护一大堆的XML配置文件。Active RecordActive Record是Rails所采用的ORM层。它完全遵循标准的ORM模型:表映射到类,记录映射到对象,字段映射到对象属性。与其他大部分ORM库的不同之处在于它的配置方式:它根据人们常用的命名惯例提供了很有意义的默认配置,因此,将需要开发者编写的配置量降到了最低。为了证明这一点,下面就是一段用Active Record写的、用于包装orders表的程序:require active_recordclass Order ActiveRecord:Baseendorder = Order.find(1)order.disc
27、ount = 0.5order.save这段代码使用我们新建的Order类来获取id为1的订单,并修改它的数量(在这里,我们省略了创建数据库连接所需的代码)。Active Record减轻了我们处理底层数据库的工作量,让我们能够更专注于业务逻辑。然而,Active Record的威力还不止于此。从第53页开始,我们将开发一个“购物车”应用程序,在那里你将看到Active Record是如何天衣无缝地与Rails框架的其他部分融为一体的。如果一个web表单包含与业务对象相关的数据,那么Active Record可以将其抽取出来、填入模型对象。Active Record还支持复杂的模型数据验证,如
28、果表单数据不能通过验证,只需编写一行代码,就可以在Rails视图中获取并格式化显示错误信息。在Rails的MVC架构中,Active Record是“模型”这一部分坚实的基础。这也正是我们为什么要专门用三章篇幅(从第281页起)来介绍它的原因。2.3 Action Pack:视图与控制器Action Pack: The View and Controller在MVC架构中,视图与控制器是密不可分的:控制器为视图提供数据,然后又接收来自页面的事件这页面正是由视图生成的。正因为有如此密切的交互,在Rails中对视图和控制器的支持被捆绑在同一个组件中,那就是Action Pack。不过,不要因为Ac
29、tion Pack是一个组件,就认为Rails应用程序中的视图代码与控制器代码会搅在一起。恰恰相反,Rails给你提供了编写web应用时必需的隔离,清晰地将控制逻辑与表现逻辑区分开来。视图支持View Support在Rails中,视图负责创建将要在浏览器上显示的页面 或者XML应答,或者E-mail,或者别的什么东西。关键在于:视图负责生成给用户看的响应内容。可能是整个页面,也可能是其中的一部分。在最简单的情况下,视图就是一堆HTML代码,用于显示固定的文本。不过,一般来说,你都需要在视图中加入一些动态内容这些动态内容通常是控制器中的action方法制造的。在Rails中,动态内容是由模板生
30、成的。模板的形式有三种,其中最常用的是ERb:用一个名为ERb(或者叫嵌入式Ruby,Embedded Ruby)的工具,将Ruby代码片段嵌入到视图的HTML代码中 对于用惯PHP或者JSP的web开发者来说,这种做法应该很熟悉。这种方式非常灵活,但一些纯粹主义者会认为它违背了MVC的精神:由于视图中嵌入了代码,我们就有可能将原本应该放在模型或控制器中的逻辑放进视图。不过在我看来,这种批评是毫无根据的:即便在传统的MVC架构中,视图也会包含程序代码。保持关注点的清晰分离原本就是开发者的职责,不应该强求工具来确保这种分离(在第23.1节“ERb模板”中,我们将详细介绍HTML模板)。XML B
31、uilder也可以用Ruby代码来构造XML文档生成的XML结构自动遵从代码的结构。我们将在第467页介绍xml.builder模板。此外,Rails还提供了RJS视图,用于在服务器端创建JavaScript片段、并将其传递到浏览器上执行。当创建Ajax界面时,这种视图会非常有用。我们将在第558页介绍rjs视图。还有控制器And the Controller!Rails控制器是应用程序的逻辑中心,它负责协调用户、视图与模型之间的交互。不过,Rails已经在幕后搞定了大部分的交互,你需要编写的代码都集中在应用层面的功能上。因此,Rails的控制器非常容易开发和维护。控制器还提供以下几种重要的辅助服务:l 它负责将外部请求指引到内部action,它所采用的URL命名规则对于普通人也同样清晰易懂。l 它负责管理缓存,这能给应用程序的性能带来数量级的提升。l 它负责管理辅助模块,后者可以扩展视图模板的功能,而又不会让视图代码膨胀。l 它负责管理session,让用户感觉仿佛是在与我们的应用程序进行持续不断的交互。关于Rails还有很多可说的。不过,与其挨个介绍它的组件,还不如让我们卷起袖子,来写一些可以工作的应用。在下一章,我们首先安装Rails
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宝山区2026年事业单位招聘备考题库附参考答案详解(达标题)
- 2026湘咨集团发布一季度劳务人员招聘48人备考题库附答案详解(满分必刷)
- 2026辽宁大连瓦房店市消防救援大队拟现社会招聘乡镇政府专职消防员45人备考题库附答案详解(完整版)
- 2026浙江杭州市西湖区西庐幼儿园招聘幼儿教师1人备考题库(非事业)附参考答案详解(预热题)
- 2026湖北武汉市黄陂区属国有企业招聘52人备考题库附答案详解(黄金题型)
- 2026湖北恩施州鹤峰巧才劳务派遣有限公司招聘备考题库有完整答案详解
- 2026贵州贵阳南明区劳动人事争议仲裁院招聘备考题库附答案详解(研优卷)
- 差旅平台考核制度
- 班组业绩考核制度
- 川农期末考核制度
- 2026四川成都经开建工集团有限公司招聘项目制工作人员6人备考题库含答案详解
- 2026年北京市离婚协议书规范范本(无子女)
- 2026届新疆维吾尔自治区乌鲁木齐市一模英语试题(有解析)
- 2025年食品安全管理员考试题库(含标准答案)
- 2025肿瘤患者心身症状临床管理中国专家共识课件
- 中西医结合治疗肿瘤的进展
- 2026年检察院书记员面试题及答案
- 多维度解析黄河河源区径流模拟与动态演变
- 绿城物业工程部考试题及答案
- TCHES65-2022生态护坡预制混凝土装配式护岸技术规程
- 租户报装充电桩合同范本
评论
0/150
提交评论