发表时间:2010-02-09
最后修改:2010-02-11
从
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
几个大的改变:
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 的架构,有几篇文章可以看看:
* 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 – a link list
写道
http://liuming.iteye.com/blog/578339
忽然发现这篇更详细,各位可参考~