Cyh的博客

Email:kissyan4916@163.com
posts - 26, comments - 19, trackbacks - 0, articles - 220

(转)Rails3 Beta发布 新特性概览

Posted on 2010-02-24 12:09 啥都写点 阅读(267) 评论(0)  编辑  收藏 所属分类: others

【Csdn.net 2月24日】感谢@ihower为CSDN提供的文章,写得非常详细。

Beginning

从Merb 和Rails 决定合 并开始,过了一年多的努力终于发布Beta 版啦。 Rails3 最重要的人物就是总架构师Yehuda Katz了, 整个把Rails core翻了好几翻,彻底改头换面。

Why? 我是这么想的,DHH 一开始开发Rails 的时候,Ruby 社群还不像现在这么发达,所以很多事情必须自己造(连prototype都 是为了Rails 而造的),为了达到非常容易设定跟快速开发的理想,得包山包海什么功能都要做,再加上有限的资源,造成了Rails core 其实绑得很紧,基本上就是一整包给你。要修改扩充它,常常就必须monkeypatch 一下。另一方面,对怎样的Ruby 程式是好程式,一开始也没有这么多人想清楚,例如Rails core 充满了alias_method_chain,这件事情现在也被认为是比较不好的写法。

Rails3 的时代不同了,Ruby 社群起来了。我们有标准的Rack介 面、我们有不同的ORM甚至是NoSQL 的储存库、我们有不同JS Libary、我们有不同测试方式RSpec、我们也有许多现成不需要自己造的新函式库。 Rails3 基本上就是这么一个接近改掉重写的版本,但是以重构的方式达成了这个兼容并蓄的目标:将API 重新厘清、彻底模组化、低耦合度元件、大幅提升效能等。具体来说,有几个成果:

用 Ruby 1.8.7 或 Ruby 1.9

1.9 的时代终于要来临了:) 可以复习一下我去年演讲的投影片

Dependencies 管理

本来的config.gem 换成新的Bundler来 管理所有用到的函式库,使用新的Gemfiles 格式,本来的config.gem sucks问题多功能有限。现在,我们真的做到可以完全不依靠系统gems。可以参考这篇Bundle me some Rails示范Bundle的用法

新的 Routes

由于全面导入Rack 的关系,现在的Route 其实也是一个Rack middleware,实作上就是rack-mount。新的Route 第一眼看到就是API 的改变了,可以参考这篇Revamped Routes in Rails 3, 不过这其实不是最重要的地方,最厉害的地方是,它参数:to 接的端点其实是rack端点,而main#home是MainController.action(:home) 的简写( 是的!! Rails3 中每个Controller actions 全都是一个标准的Rack app!! 超酷!!),可以看看Yehuda 的实 作说明。既然是Rack端点,我们就可以给它接其他Rack app,例如Sinatra,这一篇就示范了怎么接Rails 3 Routing with Rack,真是超级简单啊。我们可以预期,会有更多有趣的Rack middlewares可以与Rails结合。

另外,我们也可以直接在Routes 层直接办到redirect和render template,可以看看Yehuda的实作说明:Generic Actions in Rails 3,基本上就是简单的Rack middleware。

新的 Active Model

为了达到与不同ORM 衔接的目标,Rails3 的ActiveModel 将本来的ActiveRecord 的个别功能抽出来成为Module,例如callbacks, validations, serialization, observing, dirty tracking 等。任何Class 只要符合ActiveModel 定义的几个API,再加上include 你需要的Module,就可以与Rails3 接在一起了。请参阅ActiveModel: Make Any Ruby Object Feel Like ActiveRecord

其中Validation 有新的API,请参阅validates :rails_3, :awesome => true

ActiveRecord

那ActiveRecord 本身呢? 引入了ARel这 套SQL 产生工具(why Arel?),大幅采用“method chain” 的串接用法,让每个操作都变成了scope。

ActiveRecord 因此也有了新的API: Active Record Query Interface 3.0

ActionController

Responder 带来了respond_with,可以简化controller 的写法,用法参考Cleaner RESTful Controllers w/ respond_withDefault RESTful RenderingThree reasons to love ActionController::Responder这几篇。这工具非常有趣,我之前甚至写了一个 plugin respond_methods来 让Rails 2.x 支援这个功能。

另外,新的Render 实作可以让你轻易扩展,这一篇Render Options in Rails 3 示范了怎么做出你自己的render :pdf。

ActionView

几个大的改变:

  1. 采用Erubis实作
  2. 预设XSS protection 打开,再也不用忘记加上h 逸出了。请参考SafeBuffers and Rails 3.0有更多细节。
  3. 将 所有JavaScript helpers 改成unobtrusive。你会发现Rails3 的public/javascripts 多了一个rails.js,这就是一个JS driver,预设是接prototype.js,要换成jQuery 非常简单,只要用jQuery 版本的rails.js就 可以了。因此本来的一些Ajax Helper就被移除了,有需要的话可以在prototype_legacy_helper plugin找回来。
  4. Helpers 预设输出格式是 HTML 5。

说到HTML5,我另外推荐这份阅读材料Dive into HTML5以及HTML 5 Demos and Examples

ActionMailer

首先底层换成Mail这套工具了,可以参考这篇介绍。 接着,受益于Controller的重构成果,新的ActionMailer终于和Controller 继承自同一个AbstractController,让ActionMailer的功能增加不少,也大大的DRY了。

新的API 请参考New ActionMailer API in Rails 3.0

最后它的位置改放在app/mailers 了,放在app/models 下实在让人搞混啊。

ActiveSupport

之前的ActiveSupport 有个讨厌的地方是,如果你只想要用到其中的几个功能,很不容易搞懂到底要require 哪些东西,最后只好通通载入以求保险。新的Rails3 把这件事情弄清楚了,你可以只载入你要的部分。

Rails Application object

为了让一个Process 可以跑多个Rails app,Rails3 使用了一个Rails Application 物件来表示一整个Application 的所有设定,因此本来的config/environment.rb 的功能,几乎都搬到config/application.rb 了。另外,Rack 的标准config.ru 档案也被加到了根目录,因此要特别注意到你的Application 名称,这会是跟其他Application 互动时使用的名称,预设是目录的名字。

新的Rails Module

几个常数被拿掉了,RAILS_ROOT 要改用Rails.root、RAILS_ENV 要改用Rails.env、RAILS_DEFAULT_LOGGER 要改用Rails.logger 等,详细请参阅这篇The Rails Module (in Rails 3)。改成物件的好处是,我们就不需要做字串操作这种事情了。

新的 rails 指令

本来的script/* 指令全部拿掉了,都改成用rails。例如script/console 变成rails console (可以简写成rails c)、script/generate 变成rails generate (可以简写成rails g)、script/server 变成rails server(可以简写成rails s)。使用 rails –help 可以看到完整说明。

推荐阅读

Rails3 的阅读资料非常多,官方的Rails 3.0: Release Notes是必读。如果你从升级的方向切入,可以使用官方的升级Plugin rails-upgrade is now an official plugin,它可以帮助你:

  1. 检查需要升级的地方
  2. 产生Gemfile
  3. 产生新的routes.rb

请搭配这篇The Path to Rails 3: Approaching the upgrade服用。不过,嗯,现在还是不要在Production环境 上升级比较好,毕竟很多Plugin 还没跟上来哩(可以看看Is Your Plugin Ready For Rails 3? Rails Wiki有整理哪些Plugins OK 了)。

如果是从重新开始会容易得多,可以看The Path to Rails 3: Greenfielding new apps with the Rails 3 beta这篇。十分建 议你有空的话,现在就可以开始玩玩看了。

如果想多了解Rails 的架构,有几篇文章可以看看:

最后,如果你还想找更多,英文的懒人包有:Rails 3.0 Beta: 36 Links and Resources To Get You GoingRails 3 Reading MaterialOn the way to Rails 3 – a link list



                                                                                                       --    学海无涯