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_with、Default RESTful Rendering和Three reasons to love ActionController::Responder这几篇。这工具非常有趣,我之前甚至写了一个 plugin respond_methods来 让Rails 2.x 支援这个功能。
另外,新的Render 实作可以让你轻易扩展,这一篇Render Options in Rails 3 示范了怎么做出你自己的render :pdf。
ActionView
几个大的改变:
采用Erubis实作
预设XSS protection 打开,再也不用忘记加上h 逸出了。请参考SafeBuffers and Rails 3.0有更多细节。
将所有JavaScript helpers 改成unobtrusive。你会发现Rails3 的public/javascripts 多了一个rails.js,这就是一个JS driver,预设是接prototype.js,要换成jQuery 非常简单,只要用jQuery 版本的rails.js就 可以了。因此本来的一些Ajax Helper就被移除了,有需要的话可以在prototype_legacy_helper plugin找回来。
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 �Chelp 可以看到完整说明。
推荐阅读
Rails3 的阅读资料非常多,官方的Rails 3.0: Release Notes是必读。如果你从升级的方向切入,可以使用官方的升级Plugin rails-upgrade is now an official plugin,它可以帮助你:
检查需要升级的地方
产生Gemfile
产生新的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 的架构,有几篇文章可以看看:
The Path to Rails 3: Introduction (算是最简单的一篇,可以看看)
Rails 3 Beta is Out ― A Retrospective
Rails 3: The Great Decoupling
Rails Edge Architecture
Rails and Merb Merge: The Anniversary (Part 1 of 6)
Rails and Merb Merge: Performance (Part 2 of 6)
Rails and Merb Merge: Plugin API (Part 3 of 6)
Rails and Merb Merge: Rails Core (Part 4 of 6)
最后,如果你还想找更多,英文的懒人包有:Rails 3.0 Beta: 36 Links and Resources To Get You Going、Rails 3 Reading Material、On the way to Rails 3 �C a link list