恭喜!通过长时间的学习,肯定加强了你对 Rails 应用基础的理解。不过还有许多知识需要学习,在 Part III 将回过头对这些知识再做深入讲解。不过现在先休整一番,对 Part II 部分的知识进行简要回顾。
Rails 的思想
在 29 页第三章时,我们已经对 models、views 和 controllers 进行了介绍。现在回顾一下在 Depot 应用中是如何使用的,以及探索一番又是如何使用配置、测试及部署的。
Model
model 是应用中管理持久化数据的方式。开发 Depot 应用过程中,我们总共创建了五个 model,分别是:Cart、LineItem、Order、Product 和 User。
通常所有的 model 都会拥有 id、created_at 和 updated_at 属性。不过,我们也向 model 添加了一些带类型的属性,比如:string(有:title、name)、integer(quantity)、text(description、address)和 decimal(price),也有一些外键(product_id、cart_id)。甚至还创建过一个虚拟属性,不过它并不会被存储至数据库,也就是 password。
同时也创建过 has_many 和 belongs_to 关系,这些关系可以帮助我们在 model 对象间导航,比如从 Carts 导航至 LineItems 再导航至 Products。
通过 migration 可以更新数据库,它不仅创建 schema 同时也可以修改已经存在的数据。并且 migration 还需要能使用回滚操作。
model 不仅仅是数据的被动接受者,它还可以验证数据,防止错误的继续传播。我们使用了 presence、inclusion、numericality、ranger、uniqueness、format 和 confirmation 验证(如果你完成了所有练习的话就还使用过 length 验证)。我们甚至自定义验证,检查删除的 products 是否还有关联的 line item。通过使用 Active Record 的 hook 我们可以确保管理员的存在,并且在失败时通过事务进行回滚。
有时也编写向购物车添加商品的逻辑,将购物车中商品转移至订单的逻辑,加密和授权密码,以及计算总价的逻辑。
最后,还创建了相关商品的有序订单用于展示。
View
view 控制着向外界展示应用的方式。一般情况下,Rails 脚手架会创建 edit、index、new 和 show 的界面,同时还会有 partial 界面 form 用于在 edit 和 new 界面间共享。我们修改的了一些 partial,也为 cart 和 line item 创建了一些 partial。
为了展示没有配套 view 的 model,比如 admin、sessions 和 store,我们为它们全新建造了相应的 view。
同时,我们也更新了全局的布局文件,为整个网站创造统一的观感,并且关联相应的样式表用于渲染。通过模板生成的 JavaScript 也体验了 Web 2.0 技术,并且也使网站互动性得到提升。
在主视图中,通过辅助方法使购物车在适当的时机进行隐藏。
我们还根据客户的地域使用英语或西班牙语显示。
我们不仅关注 HTML view,同时也创建 plain-text view 和 Atom view。不过有些 view 并不适合在浏览器显示,主要还是用于发送邮件,并且在这些 view 中都可以使用 line item 的 partial。
Controller
直到最后,我们总共创建了八个 controller,其中五个每个 model 对应一个,另外三个分别是用于 admin、sessions 和 store 的。
controller 与 model 交互有多种方式,可以通过查找获取数据的方式,也可以通过设置为实例变量对 model 进行更新,或者通过表单保存数据。当交互完成后会重定向至其他 action 或者渲染 view,并且可以渲染 HTML、JSON 和 Atom 类型的 view。
在 line item controller 中我们还限制了可以通过的参数。
并且我们还创建了 action 回调函数,用于查找购物车、设置语言以及授权请求。在 concern 中我们还替换了多个 controller 共用的逻辑,也就是 CurrentCart 模块。
管理 session 也是我们的工作之一,主要用于追踪登录用户(从管理员角度出发)及购物车(从客户角度出发)。而记录当前地域主要是为了网站的国际化显示功能。我们也捕捉错误并记录它们,然后通过 notices 告知用户。
通过 fragment 缓存的方式处理了网站首页,并在 Atom feed 中使用了页面级的缓存。
在接收到订单时还会发送确认邮件。
Configuration
按约定来说 Rails 应用应保持最少数量的配置,不过我们还是添加了一些定制化配置。
为了在生产环境使用 MySQL 我们对数据库配置进行了修改。
对于一些资源也添加了相应的路由,比如 admin 和 session controller,以及网站的根路径,也就是网站首页。同时还定义了 products 中的 who_bought 路由,用于访问 Atom feed 获取相应信息。
并且我们也为 i18n 创建了初始工具,为英语或西班牙语更新相应的本地化信息。
还为数据库创建了 seed 数据。
为了部署还创建了 Capistrano 脚本,其中包含一些自定义任务。
Testing
我们维护和加强了所有的测试。
通过单元测试我们可以测试方法,也通过提供 line item 测试商品数量的增加。
Rails 为脚手架创建的 controller 都提供了基本的测试,我们又根据自己的需要进行了修改。当然,我们也会添加一些测试,比如关于 Ajax 的,还有在创建订单前购物车是否有商品的测试。
通过 fixture 向测试提供数据原料。
最后,通过集成测试验证端到端场景,包括用户向购物车添加商品,提交订单及获取确认邮件。
Deployment
在使用 Apache httpd 和 MySQL 的生产级环境中我们部署了应用。接着安装及配置了 Phusion Passenger 运行应用、Bundler 管理依赖、以及通过 Git 管理代码。而 Capistrano 是用于从开发环境向生产环境部署更新应用的工具。
使用 test 和 production 环境是为了防止开发期间的实验对生产环境造成影响。在开发环境下,通常使用轻量级的 SQLite 数据服务和轻量级的 web 服务 WEBrick,而测试是运行于带有 fixture 提供数据的集成环境中。
记录完成的工作
完成回顾后,让我们从两个新角度看看代码。
Rails 能够方便地使用 Ruby 的 RDoc 工具,可以将应用中的所有源文件形成利于观看的开发文档。不过在生成文档之前,需要先通过几个段落介绍相应的功能,以便使用者知道此生成的文档有何用途。
首先编辑 README.rdoc 文件,并写入任何你认为有用的信息。此文件将用于 RDoc 操作,而且你还可以灵活地调整格式。
通过 rake 命令可以将其生成 HTML 格式的文档。
rake doc:app
生成的文档在 doc/app 路径中,文档样式如下图:
Our application's internal documentation最后,也许我们对自己编写了多少代码好奇,有个 Rake 操作就能完成相应功能。
rake stats
如果仔细比对一番,你已经编写了许多代码,但并不是全部,而且许多代码都是被生成的。这就是 Rails 的魔力。
本文翻译自《Agile Web Development with Rails 4》,目的为学习所用,如有转载请注明出处。
网友评论