Rails3 RC 發佈: 重點導覽

RailsConf 結束之後就嚷嚷要發佈的 Rails 3 Release Candidate 候選版本終於出了(好吧,是三個禮拜前的事情了,這篇拖稿了 XD),如果你還沒進場,又是一個好時機。從我上次(疑,竟然是半年前了!!)整理 Rails3 Beta 發佈: 重點導覽 以來,又有了一些不錯的文件,經過筆者過濾挑選,重新整理 Rails3 的八大重點:

1. Bundler
2. ActiveRecord 的新 Query API
3. ActiveRecord 的新 Validation API
4. Views: XSS, Block Helper, UJS
5. I18n
6. 新的 Routing API
7. 新的 ActionMailer
8. Metal

如果喜歡看 screencast,官方也錄了 rubyonrails.org/screencasts/rails3

安裝

升級到 ruby 1.8.7 或 1.9.2,以及 rubygems 要 1.3.6 以上


gem update --system
gem install rails --pre
gem install mysql2

開始改用 mysql2 gem 吧,這一套修正了 multithreaded 及 Ruby 1.9 的 Encoding 問題

升級

如果是升級,重點 Bundler 和 Views 部分必須先搞懂,不然完全動不了。其他 API 變更的部份(Routing, ActiveRecord, ActionMailer) 在 Rails 3.1 之前暫時是可以 works。當然有空還是趕快研究一下囉。以下是兩篇有關升級的新文章:

* Upgrading a Rails 2 App to Rails 3
* The Road to Rails 3: make your Rails 2.3 project more Rails 3 oriented

Rails 本身升級是沒有問題,怕的是周邊的 Plugin 沒能跟上。railsplugins.org 有整理一些,可以找找 github 上有沒有 branch,而 Rails3 透過 Bundle 安裝還蠻方便的。

1. Bundler

* Bundler: Rails3 用來管理 Gem dependencies 的神器

2. ActiveRecord Query Interface

Rails2 的 finders, named_scope, with_scope 等用法,在 Rails3 統一為一種 Relation 用法,可以更容易做 composable(chainable)、Decoupled from SQL 以及 Lazy Loading。另外如果是有傳參數的 scope,也偏好定義成 class method,而不是 scope + lambda 了。以下是一些不錯的文章:

* Active Record Query Interface 3.0 基本用法介紹
* ActiveRelation: ActiveRecord Gets a Facelift 基本用法介紹
* Active Record Queries in Rails 3 基本用法介紹
* Advanced Queries in Rails 3 進階用法介紹
* The Skinny on Scopes (Formerly named_scope) 進階用法介紹,跨 Model 的 Scope 太厲害了。
* New Active Record scoping syntax 如果你在 Rails2 有使用 with_scope 或 with_exclusive_scope( :find => x, :create => y ) 請讀這篇。新的 Rails3 建議你改用 scoping, unscoped, create_with 等新用法,因為舊的用法行為有差異。

3. ActiveRecord Validation

* AR Validation 提供了新的 API 只要一行就可以整合同一個屬性的多個驗證,可以減少行數。
* 可以客製 EachValidator 整合進上述的新 API 之中
* 可以客製 Validator 包裝一大堆 validations,例如 validates_with ReallyComplexValidator
* save(false) 終於拿掉了,要跳過驗證儲存請 save(:validate => false)

* Validations in Rails 3
* Improved validations in Rails 3
* validates :rails_3, :awesome => true
* Independent Model Validators

另外就是驗證錯誤的 API 也改了:

* Errors#on 跟 on_base 拿掉了,請改用 Errors#[]
* Errors#add_to_base(msg) 拿掉了,請改用 Errors#[:base] << msg * Views 裡面常用的 error_messages_for 跟 error_message_on Helper 被拿掉了,請自己寫過(你可以參考 scafffold 產生出來的程式)或裝回 legacy plugin

4. View

* Rails3 如何換使用 jQuery
* Unobtrusive JavaScript in Rails 3
* 所有有傳 code block 的 Helper 都改成 <%= 的形式,
請參考 Rails3 如何寫 Helper 可以傳 Block 參數 一文
* Rails3 處理 XSS: Rails 3 Security Strategy,HTML 預設都會逸出了,不要逸出請用 raw Helper 或字串的 html_safe! 方法。

5. I18n

* 詞彙檔中的變數替換由 {{}} 變成 %{} 了。這有點惱人,我還碰到 redmine 的問題(redmine 使用 Rails2,但是卻因為裝了 Rails3 所以 i18n 也升級到 0.4.1 版本就爆炸了)
* 提供更多 backends,例如 ActiveRecord
* 加速功能!! Run, I18n, run!

6. Routing

* Rails3 重點導覽:新的 Routes
* The Lowdown on Routes in Rails 3 很詳盡的用法介紹
* The Powerful New Rails Router 進階用法
* Rack in Rails 3 結合 Rack 端點的應用

7. ActionMailer

底層由 TMail 換 Mail gem,一整個砍掉重練 API 大改。原本動態的 Notifiter.deliver_welcome_email 寫法變成 Notifiter.welcome_email.deliver,其中的 Notifiter.welcome_email 是一個 Mail::Message 物件。

* A Whole New ActionMailer
* Action Mailer in Rails 3
* 一個範例
* Inline Attachments for ActionMailer

8. Metal

* Rails3: 新的 Metal 機制