论坛首页 编程语言技术论坛

<转>Rails3 Beta 发布: 重点导览

浏览 11814 次
该帖已经被评为良好帖
作者 正文
   发表时间: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 appRails3 使用了一个 Rails Application 对象来表示一整个 Application 的所有设定,因此本来的 config/environment.rb 的功能,几乎都搬到 config/application.rb 了。另外,Rack 的标准 config.ru 档案也被加到了根目录,因此要特别注意到你的 Application 名称,这会是跟其它 Application 互动时使用的名称,预设是目录的名字。


新的 Rails Module

几个常数被拿掉了,RAILS_ROOT 要改用 Rails.rootRAILS_ENV 要改用 Rails.envRAILS_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
忽然发现这篇更详细,各位可参考~

 

   发表时间:2010-02-09  
你用繁体,让我很不爽。

原英文版的地址你也应该贴出来。
0 请登录后投票
   发表时间:2010-02-09  
很抱歉,我只看到繁體版,英文版沒看見.而且那個作者好像就是用繁體的~Sorry
0 请登录后投票
   发表时间:2010-02-09  
作者是张文钿,臺灣的.你在GR里訂閱這個就看的到了{|ihower.tw| blog }
0 请登录后投票
   发表时间:2010-02-10   最后修改:2010-02-10
Prototype是为了Rails而造的?但似乎Prototype出现的时间比Rails要早吧?
补充:刚查了一下,还真有这回事……
0 请登录后投票
   发表时间:2010-02-10  
darkbaby123 写道
Prototype是为了Rails而造的?但似乎Prototype出现的时间比Rails要早吧?
补充:刚查了一下,还真有这回事……

一开始是为了在rails中提供相应的ajax方面的应用而开发的,不过现在已经是一个独立的项目了。
1 请登录后投票
   发表时间:2010-02-20  
看完了,不错哦。有了大概的一个认识。
看了railscast刚出来的两篇,关于rvm和bundler的介绍。
我的装上去报一些错,暂时先不折腾了。
等待正式版出来吧。

0 请登录后投票
   发表时间:2010-02-23  
有很多新概念出现,都看不懂了
0 请登录后投票
   发表时间:2010-02-23  
可不可以直接跳过2用3啊?变化太大,以前的积蓄都不管用了。
0 请登录后投票
   发表时间:2010-02-25  
到处都是 Rack, 这东西思想简单, 用起来转个弯的,没有很好的学习资料
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics