`
laserdance
  • 浏览: 90354 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

读[WEB开发敏捷之道/用Rails敏捷Web开发2ndVersion]

阅读更多
今天在网上找到了林芷薰译的RoR书籍,看序知道了第2版和第1版相比有了很大变化:第一章照例是简介:Ror是一个框架,一个使web应用开发部署和维护更加容易的框架。开始的时候rails仅仅是当做一个快速开发网站应用的工具。所有的rails应用都采用了Model-View-Controller的架构,从一开始,Rails就帮你准备好了应用程序的骨架。Rails也支持测试,Rails应用是用Ruby编写的。
   Rails设计始终遵循两个核心原则:DRY(Don't Repeat Yourself)和惯例优于配置(convention over configuration)。Rails构架还将Ajax和RESTful接口之类的新技术整合到自己的应用中,它内建了对这些技术的支持。
   Agile Web Development with Rails(AWDWR )
上面只是介绍Rails背后的概念,下面我们将构造一个简单的在线商店系统,下面就和我一起亲身体验一下Rails编程的感觉吧:)
前提是你需要懂Ruby才能写Rails应用程序,这里我就默认你已经掌握了Ruby.我们下面是以Rails1.2版为例讲述的。Rails1.2强调REST,并且增加了废弃(deprecation)机制。
  下图展示了Rails处理一个请求的全过程,应用程序向用户展现了一个“产品分类列表”页面,用户点击某个产品旁边的Add To Cart Button。这个Button链接的我们的应用程序:http://xxx/store/add_to_cart/123,其中123为所选商品在系统内部的ID号。
当收到请求以后,路由把路径的第一部分store看作控制器的名称,第2部分add_to_cart看作action的名称,最后一部分123按照惯例被放入一个名为id的内部参数,这样分析后路由组件就知道,应该调用StoreController这个控制器类中的add_to_cart()方法。该方法会处理用户的请求,找到当前用户的购物车,请求模型找出编号为123的商品的信息,然后告诉购物车将该商品放入其中,注意这里:控制器只是告诉它做什么,而模型自己知道该怎么做。
   现在购物车中已放进了刚选购的商品,我们这里需要将这事实展现给用户看,控制器会安排视图访问模型中的购物车对象,并调用视图代码使之呈现给用户,在Rails中通常是隐藏在幕后进行的,对于特定的action,Rails将根据用户名惯例自动为其查找一个特定的视图。
  Active Record:Rails的模型支持
  一般来说我们都希望将web应用中的信息保存到关系型数据库中,一个订单系统会在数据库中存储订单,订单项,客户信息等数据,即使是处理大量非结构文本的应用(blog和新闻网站)也常常采用数据库作为后端数据的存储介质。关系型数据库是根据数学中的集合理论设计出来的,从概念来说是好事,但它也使得关系型数据库和面向对象编程语言很难融为一体:对象关注的是数据和操作,而数据库关注的则是值的集合。在长时间的实践中,人们想出了很多办法使关系型数据库与OO模型相协调。下面我们看两种不同的途径:1 以数据库为中心组织应用程序,2 以应用程序为中心组织数据库。
一 数据库为中心的程序设计
   以数据库为中心的程序设计中,程序员一般使用的是过程性语言,如C和Cobol,这样他们直接在代码中嵌入SQL,可能是将SQL语句作为字符串嵌入,也可能是使用预处理器奖源码中的SQL编译成针对数据库引擎的低级调用。
如:我们要找出所有的订单,并更新所有订单的销售税。
C ==>
exec sql begin declare section;
int id;
fload amount;
exec sql end declare section;

exec sql declare c1 as cursor for select id,amount from orders;
while(1){
float tax;
exec sql whenever not found do break;
exec sql fetch c1 into :id,:amount;
tax = calc_sales_tax(amount);
exec sql update orders set tax = :tax where id = :id;
}
exec sql close c1;
exec sql commit work;
这种风格在Perl和PHP类的脚本语言中很常见。
下面我们用Ruby的DBI库写出类似的代码:
def update_sales_tax
update = @db.prepare("update orders set tax=? where id=?")
@db.select_all("select id,amount from orders") do |id,amount|
tax = calc_sales_tax(amount)
update.execute(tax,id)
end
end
这样看起来很简单明了,但实际上将业务逻辑和数据库访问混在一起使应用程序变得难于维护难于扩展。
在通常的程序设计中面向对象的经验告诉我们:封装可以解决这类问题。我们可以将订单相关的所有东西封装在一个类中,这样,当规则发生变化时,只需要修改一个地方。
人们也将这样的思想延伸到了数据为患编程的领域。我们将“对数据库的访问”包装在一层类后面,应用程序剩下的部分都通过这些类来访问数据--它们永远不会直接跟数据库打交道。这样我们就把所有与数据库结构相关的事情都封装在一层代码之后,从而使我们的应用程序代码和数据库访问的细节解开耦合,在这个改变销售税的例子中,我们只要修改对订单表进行封装的这个类,使其在销售税发生改变时更新时间戳就可以了。
不过在真实世界中数据库表是彼此关联的,所以我们希望将这种关联映射到我们的对象中:代表订单的Order对象应该饮食一组代表订单项的LineItem对象,但这样一来,我们就会遇到对象导航,性能及数据一致性等等方面的问题。这里Rails也用到了ORM(Object-Relational Mapping)对象-关系映射。
ORM库可以将数据库表映射到类,如果数据库中有一张名为Orders的表,我们的程序中就会有一个名为Order的类,表中每条记录对应于该类的一个对象:一条订单记录将被表现为Order类的一个对象。Rails类还对数据库表进行了包装,提供了一组类级别的方法,用于执行表级别的操作。如我们需要找出具有某一特定ID的订单,这一功能被实现为一个类方法,该方法返回对应的Order对象,Ruby中是这样实现的:
  order = Order.find{1)
  puts "Order #{order.customer_id},amount=#{order.amount}"
如果这些方法返回一组对象的集合:
Order.find(:all,:conditions => "name='dave'").each do |order|
puts order.amount
end
save方法将对象中的数据保存回到数据库
Order.find(:all, :conditions => "name='dave'").each do |order|
  order.discount= 0.5
  order.save
end
在一个典型的ORM库中,你可以提供配置数据来指定数据库端与应用程序端之间的映射关系。我们发现我们不得不忙于创建和维护一大堆的XML配置文件
Active Record
  Active Record 是Rails所采用的ORM层,它完全遵循标准的ORM模型,表映射到类,记录映射到对象,字段映射到对象属性.但于其它ORM库不同的是它的配置方式:它根据人们常用的命名惯例提供了很有意义的默认配置.因此,将需要开发者编写的配置降到了最低,下面举例来说明
require 'active_record'
class Order < ActiveRecord::Base
end
order = Order.find(1)
order.discount = 0.5
order.save

这段代码使用我们新建的Order类来获取id为1的订单,交修改它的数量.然后保存.我们可以看出Active Record减轻了我们处理底层数据库的工作量,让我们更专注于业务逻辑.如果一个web表单包含与业务对象相关的数据,那么Active Record 可以将它抽取出来,填入模型对象.还支持复杂的模型数据验证,如果表单数据不能通过验证,只需要编写一行代码,就可以在Rails视图中获取并格式化显示错误信息.
在Rails MVC架构中,Active Record是 M模型这一部分的坚实基础.

下面我们来介绍视图与控制器
Action Pack:在mvc架构中,视图与控制器是密不可分的:控制器为视图提供数据,然后又接收来自页面的事件,这页面也是由视图生成的.在Rails中对视图和控制器支持被捆绑到一个组件中,即Action Pack.虽为一个组件,但Rails却清晰地将控制逻辑与表现逻辑区分开来.
视图支持 View Support
视图负责创建要在浏览器上显示的页面,可能是整个页面也可能是其中一部分,一般来说你都需要在视图中加入一些动态内容,而这些动态内容通常是控制器中的action方法制造的.
动态内容由模板生成.模板形式有3种:其中常用的是rhtml,用一个名为erb的工具,将ruby代码片段嵌入到视图的html代码中.
第二种是rxml视图,借助这种视图模板,可以用ruby代码构造xml文档.
第三种是rjs视图.用于在服务器端创建javascript片段,并将其传递到browser上执行.当创建Ajax界面时,这种视图会非常有用.
控制器 Controller
Controller是应用程序的逻辑中心,它负责协调用户,视图与模型之间的交互.由于Rails在幕后搞定了大部分的交互,所以Controller非常容易开发和维护.
Controller提供以下几种重要的辅助服务:
1 它负责将外部请求指引到内部的action,它所采用的URL命名规则对于普通人也样清晰易懂
2 它负责管理缓存,这能给应用程序的性能带来数量级的提升
3 它负责管理辅助模块,后者可以扩展视图模板的功能,而不会让视图代码膨胀
4 它负责管理session,让用户感觉是在与我们的应用程序进行持续不断的交互

至此,我们的一些基本的概念的介绍就结束了.下面一篇是讲如何安装rails及开发一个在线商店系统的简单例子.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics