【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_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 –help 可以看到完整說明。
推薦閱讀
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 的架構,有幾篇文章可以看看:
最后,如果你還想找更多,英文的懶人包有: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
--
學海無涯