更多資訊請見 rubyonrails.org:

Ruby on Rails 3.0 發行說明

Rails 3.0 就像小馬和彩虹一樣美好!它會為你煮晚餐並折好你的衣服。你會想知道在它出現之前,生活是如何可能的。這是我們做過最好的 Rails 版本!

但說真的,它真的很棒。當 Merb 團隊加入時,帶來了許多好主意,並專注於框架不可知性、更精簡和更快的內部結構,以及一些美味的 API。如果你是從 Merb 1.x 來使用 Rails 3.0,你會認出很多東西。如果你是從 Rails 2.x 來,你也會愛上它。

即使你不關心我們的任何內部清理,Rails 3.0 也會讓你感到高興。我們有一堆新功能和改進的 API。現在是成為 Rails 開發人員的最佳時機。以下是一些重點:

  • 全新的路由器,重點在於 RESTful 宣告
  • 新的 Action Mailer API,以 Action Controller 為模型(現在發送多部分訊息不再痛苦!)
  • 建立在關係代數之上的新的 Active Record 可鏈式查詢語言
  • 適用於 Prototype、jQuery 的非侵入式 JavaScript 輔助方法,以及更多即將推出(結束內聯 JS)
  • 使用 Bundler 進行明確的相依性管理

最重要的是,我們已盡力使用友好的警告來棄用舊的 API。這表示你可以將現有的應用程式移至 Rails 3,而無需立即將所有舊程式碼重寫為最新的最佳實務。

這些發行說明涵蓋了主要的升級,但不包括每個小的錯誤修復和變更。Rails 3.0 由 250 多位作者提交了近 4,000 次提交!如果你想查看所有內容,請查看 GitHub 上主要 Rails 儲存庫中的提交列表

若要安裝 Rails 3

# Use sudo if your setup requires it
$ gem install rails

1 升級至 Rails 3

如果你要升級現有的應用程式,最好先做好測試涵蓋範圍。你也應該先升級至 Rails 2.3.5,並確保你的應用程式仍然如預期執行,然後再嘗試更新至 Rails 3。然後注意以下變更

1.1 Rails 3 至少需要 Ruby 1.8.7

Rails 3.0 需要 Ruby 1.8.7 或更高版本。已正式放棄對所有先前 Ruby 版本的支援,你應盡快升級。Rails 3.0 也與 Ruby 1.9.2 相容。

請注意,Ruby 1.8.7 p248 和 p249 有導致 Rails 3.0 當機的序列化錯誤。不過,Ruby Enterprise Edition 自 1.8.7-2010.02 版起已修復這些錯誤。在 1.9 方面,Ruby 1.9.1 無法使用,因為它在 Rails 3.0 上完全出現分段錯誤,因此如果你想在 1.9.x 上使用 Rails 3,請跳至 1.9.2 以順利進行。

1.2 Rails 應用程式物件

作為在同一程序中支援執行多個 Rails 應用程式的基礎,Rails 3 引入了應用程式物件的概念。應用程式物件包含所有應用程式特定的設定,其性質與先前 Rails 版本的 config/environment.rb 非常相似。

現在每個 Rails 應用程式都必須有對應的應用程式物件。應用程式物件在 config/application.rb 中定義。如果你要將現有的應用程式升級至 Rails 3,你必須新增此檔案,並將適當的設定從 config/environment.rb 移至 config/application.rb

1.3 script/* 由 script/rails 取代

新的 script/rails 取代了以前位於 script 目錄中的所有指令碼。不過,你不會直接執行 script/railsrails 命令會偵測到它是在 Rails 應用程式的根目錄中叫用,並為你執行指令碼。預期的用法是

$ rails console                      # instead of script/console
$ rails g scaffold post title:string # instead of script/generate scaffold post title:string

執行 rails --help 以取得所有選項的清單。

1.4 相依性和 config.gem

config.gem 方法已消失,並已由使用 bundlerGemfile 取代,請參閱下面的供應商化 Gem

1.5 升級程序

為了協助升級程序,已建立名為 Rails Upgrade 的外掛程式以自動化部分程序。

只需安裝此外掛程式,然後執行 rake rails:upgrade:check 以檢查你的應用程式是否有需要更新的部分(並提供如何更新它們的資訊連結)。它也提供了一個根據你目前的 config.gem 呼叫產生 Gemfile 的工作,以及一個從你目前的路由檔案產生新路由檔案的工作。若要取得此外掛程式,只需執行下列動作

$ ruby script/plugin install git://github.com/rails/rails_upgrade.git

你可以在Rails Upgrade 現在是正式外掛程式中查看其運作方式的範例

除了 Rails Upgrade 工具之外,如果你需要更多協助,在 IRC 和 rubyonrails-talk 上有人可能正在做同樣的事情,也可能遇到相同的問題。請務必在你升級時部落格你的經驗,以便其他人可以從你的知識中獲益!

2 建立 Rails 3.0 應用程式

# You should have the 'rails' RubyGem installed
$ rails new myapp
$ cd myapp

2.1 供應商化 Gem

Rails 現在在應用程式根目錄中使用 Gemfile 來判斷你的應用程式啟動所需的 gem。此 GemfileBundler 處理,然後安裝所有相依性。它甚至可以將所有相依性本機安裝到你的應用程式,使其不依賴於系統 gem。

更多資訊:- bundler 首頁

2.2 使用最新版本

BundlerGemfile 使用新的專用 bundle 命令使凍結你的 Rails 應用程式變得輕而易舉,因此 rake freeze 不再相關且已移除。

如果你想直接從 Git 儲存庫捆綁,你可以傳遞 --edge 旗標

$ rails new myapp --edge

如果你有 Rails 儲存庫的本機簽出,並且想使用它產生應用程式,你可以傳遞 --dev 旗標

$ ruby /path/to/rails/bin/rails new myapp --dev

3 Rails 架構變更

Rails 的架構有六個主要變更。

3.1 Railties 重新串連

Railties 已更新,為整個 Rails 架構提供一致的外掛程式 API,以及產生器和 Rails 繫結的全面重寫,結果是開發人員現在可以以一致、明確的方式連結到產生器和應用程式架構的任何重要階段。

3.2 所有 Rails 核心組件都已解耦

隨著 Merb 和 Rails 的合併,其中一項重大任務是移除 Rails 核心組件之間的緊密耦合。這項任務現已完成,所有 Rails 核心組件現在都使用相同的 API,您可以使用該 API 來開發外掛程式。這表示您建立的任何外掛程式,或任何核心組件的替代方案(例如 DataMapper 或 Sequel)都可以存取 Rails 核心組件所擁有的所有功能,並隨意擴充和增強。

更多資訊:- The Great Decoupling

3.3 Active Model 抽象化

解耦核心組件的一部分是從 Action Pack 中提取所有與 Active Record 的關聯。這項任務現已完成。所有新的 ORM 外掛程式現在只需要實作 Active Model 介面,即可與 Action Pack 無縫協作。

更多資訊:- Make Any Ruby Object Feel Like ActiveRecord

3.4 控制器抽象化

解耦核心組件的另一個重要部分是建立一個基礎超類別,它與 HTTP 的概念分離,以便處理視圖的渲染等。AbstractController 的建立使得 ActionControllerActionMailer 得以大幅簡化,將所有這些函式庫中的通用程式碼移除並放入 Abstract Controller 中。

更多資訊:- Rails Edge Architecture

3.5 Arel 整合

Arel(或 Active Relation)已被採用為 Active Record 的基礎,現在是 Rails 的必需項目。Arel 提供 SQL 抽象化,簡化了 Active Record,並為 Active Record 中的關係功能提供基礎。

更多資訊:- Why I wrote Arel

3.6 郵件提取

Action Mailer 自成立以來,除了在原始碼樹狀結構中加入 TMail 外,還進行了 monkey patch、預處理器,甚至是傳遞和接收代理程式。版本 3 將所有電子郵件訊息相關的功能抽象化到 Mail gem 中,這項變更減少了程式碼重複,並有助於在 Action Mailer 和電子郵件剖析器之間建立可定義的界線。

更多資訊:- New Action Mailer API in Rails 3

4 文件

Rails 樹狀結構中的文件正在更新所有 API 變更,此外,Rails Edge Guides 正在逐一更新,以反映 Rails 3.0 中的變更。但是,guides.rubyonrails.org 上的指南將繼續只包含 Rails 的穩定版本(目前是 2.3.5 版,直到 3.0 發布)。

更多資訊:- Rails Documentation Projects

5 國際化

Rails 3 在 I18n 支援方面做了大量工作,包括最新的 I18n gem 提供了許多速度改進。

  • 任何物件的 I18n - 透過包含 ActiveModel::TranslationActiveModel::Validations,可以將 I18n 行為新增至任何物件。翻譯還有 errors.messages 回退功能。
  • 屬性可以有預設的翻譯。
  • 表單提交標籤會根據物件狀態自動提取正確的狀態(建立或更新),因此會提取正確的翻譯。
  • 使用 I18n 的標籤現在也可以透過只傳遞屬性名稱來運作。

更多資訊:- Rails 3 I18n changes

6 Railties

隨著主要 Rails 框架的解耦,Railties 進行了大規模的全面檢修,以便盡可能輕鬆且可擴充地連結框架、引擎或外掛程式

  • 現在每個應用程式都有自己的命名空間,例如,應用程式使用 YourAppName.boot 啟動,使得與其他應用程式的互動更加容易。
  • 現在 Rails.root/app 下的任何內容都會新增至載入路徑,因此您可以建立 app/observers/user_observer.rb,而 Rails 將會在不進行任何修改的情況下載入它。
  • Rails 3.0 現在提供 Rails.config 物件,該物件提供各種 Rails 範圍組態選項的中央儲存庫。

    應用程式產生已收到額外的旗標,可讓您略過 test-unit、Active Record、Prototype 和 Git 的安裝。此外,還新增了一個新的 --dev 旗標,它會設定應用程式,使 Gemfile 指向您的 Rails 簽出(由 rails 二進位檔的路徑決定)。如需更多資訊,請參閱 rails --help

Railties 產生器在 Rails 3.0 中受到高度關注,基本上

  • 產生器已完全重寫,且不向下相容。
  • Rails 範本 API 和產生器 API 已合併(它們與先前相同)。
  • 產生器不再從特殊路徑載入,它們只是在 Ruby 載入路徑中找到,因此呼叫 rails generate foo 將會尋找 generators/foo_generator
  • 新的產生器提供掛鉤,因此任何範本引擎、ORM、測試框架都可以輕鬆掛接。
  • 新的產生器允許您將複本放置在 Rails.root/lib/templates 來覆寫範本。
  • 還提供了 Rails::Generators::TestCase,以便您可以建立自己的產生器並測試它們。

此外,由 Railties 產生器產生的視圖也進行了一些全面檢修

  • 視圖現在使用 div 標籤,而不是 p 標籤。
  • 現在產生的鷹架會使用 _form partials,而不是在編輯和新增視圖中重複程式碼。
  • 鷹架表單現在使用 f.submit,它會根據傳入物件的狀態傳回「Create ModelName」或「Update ModelName」。

最後,rake 任務中新增了一些增強功能

  • 新增了 rake db:forward,讓您可以個別或分組向前移動您的遷移。
  • 新增了 rake routes CONTROLLER=x,讓您只能檢視一個控制器的路由。

Railties 現在已棄用

  • 使用 Rails.root 取代 RAILS_ROOT
  • 使用 Rails.env 取代 RAILS_ENV,以及
  • 使用 Rails.logger 取代 RAILS_DEFAULT_LOGGER

PLUGIN/rails/tasksPLUGIN/tasks 不再載入,現在所有任務都必須位於 PLUGIN/lib/tasks 中。

更多資訊

7 Action Pack

Action Pack 中發生了重大的內部和外部變更。

7.1 Abstract Controller

Abstract Controller 將 Action Controller 的通用部分提取到一個可重複使用的模組中,任何程式庫都可以使用該模組來呈現範本、呈現 partials、helper、翻譯、記錄、請求回應週期的任何部分。這種抽象化使得 ActionMailer::Base 現在只需繼承自 AbstractController,並將 Rails DSL 包裝到 Mail gem 上即可。

它還提供了一個清理 Action Controller 的機會,抽象化了可以簡化程式碼的內容。

但是請注意,Abstract Controller 不是面向使用者的 API,您在日常使用 Rails 時不會遇到它。

更多資訊:- Rails Edge Architecture

7.2 Action Controller

  • application_controller.rb 現在預設會啟用 protect_from_forgery
  • cookie_verifier_secret 已被棄用,現在改為透過 Rails.application.config.cookie_secret 指派,並移至自己的檔案中:config/initializers/cookie_verification_secret.rb
  • session_storeActionController::Base.session 中設定,現在已移至 Rails.application.config.session_store。預設值在 config/initializers/session_store.rb 中設定。
  • cookies.secure 允許您在 cookie 中設定加密值,方法是 cookie.secure[:key] => value
  • cookies.permanent 允許您在 cookie 雜湊中設定永久值,方法是 cookie.permanent[:key] => value,如果驗證失敗,則會在簽名值上引發例外狀況。
  • 您現在可以將 :notice => 'This is a flash message':alert => 'Something went wrong' 傳遞給 respond_to 區塊內的 format 呼叫。flash[] 雜湊仍會像先前一樣運作。
  • 現在您的控制器已新增了 respond_with 方法,簡化了原本的 format 區塊。
  • 新增了 ActionController::Responder,讓您可以彈性地控制如何產生回應。

棄用

  • filter_parameter_logging 已被棄用,改用 config.filter_parameters << :password

更多資訊

7.3 Action Dispatch

Action Dispatch 是 Rails 3.0 中的新功能,為路由提供了一種新的、更簡潔的實作方式。

  • 對路由器進行了大規模的清理和重寫,Rails 路由器現在是 rack_mount,其上具有 Rails DSL,它是一個獨立的軟體。
  • 每個應用程式定義的路由現在都在您的應用程式模組中具有命名空間,也就是說

    # Instead of:
    
    ActionController::Routing::Routes.draw do |map|
      map.resources :posts
    end
    
    # You do:
    
    AppName::Application.routes do
      resources :posts
    end
    
  • match 方法新增至路由器,您也可以將任何 Rack 應用程式傳遞至相符的路由。

  • constraints 方法新增至路由器,讓您可以使用定義的條件約束來保護路由器。

  • scope 方法新增至路由器,讓您可以為不同的語言或不同的動作命名路由空間,例如

    scope 'es' do
      resources :projects, :path_names => { :edit => 'cambiar' }, :path => 'proyecto'
    end
    
    # Gives you the edit action with /es/proyecto/1/cambiar
    
  • root 方法新增至路由器,作為 match '/', :to => path 的快捷方式。

  • 您可以將可選的區段傳遞至 match,例如 match "/:controller(/:action(/:id))(.:format)",每個以括號括住的區段都是可選的。

  • 路由可以使用區塊表示,例如您可以呼叫 controller :home { match '/:action' }

舊樣式的 map 命令仍然像以前一樣使用向下相容層運作,但是這將會在 3.1 版本中移除。

棄用

  • 現在會註解掉非 REST 應用程式的 catch all 路由 (/:controller/:action/:id)。
  • 路由 :path_prefix 不再存在,而 :name_prefix 現在會自動在給定值的結尾新增「_」。

更多資訊:* The Rails 3 Router: Rack it Up * Revamped Routes in Rails 3 * Generic Actions in Rails 3

7.4 Action View

7.4.1 非侵入式 JavaScript

Action View helpers 中進行了重大重寫,實作了非侵入式 JavaScript (UJS) 掛鉤,並移除了舊的內嵌 AJAX 命令。這使 Rails 可以使用任何相容的 UJS 驅動程式,以實作 helpers 中的 UJS 掛鉤。

這表示所有先前的 remote_<method> 輔助方法都已從 Rails 核心移除,並放入 Prototype Legacy Helper 中。若要在您的 HTML 中加入 UJS 掛鉤,您現在應傳遞 :remote => true。例如:

form_for @post, :remote => true

產生

<form action="http://host.com" id="create-post" method="post" data-remote="true">

7.4.2 帶區塊的輔助方法

form_fordiv_for 這種從區塊插入內容的輔助方法現在使用 <%=

<%= form_for @post do |f| %>
  ...
<% end %>

您自己的這類輔助方法應該會傳回字串,而不是手動附加到輸出緩衝區。

cachecontent_for 這種執行其他動作的輔助方法不受此變更影響,它們仍然需要像以前一樣使用 &lt;%

7.4.3 其他變更

  • 您不再需要呼叫 h(string) 來逸出 HTML 輸出,它在所有檢視範本中預設為啟用。如果您想要未逸出的字串,請呼叫 raw(string)
  • 輔助方法現在預設輸出 HTML5。
  • 表單標籤輔助方法現在會從 I18n 中提取單一值,因此 f.label :name 將會提取 :name 的翻譯。
  • I18n 選擇標籤現在應該是 :en.helpers.select 而不是 :en.support.select。
  • 您不再需要在 ERB 範本中的 Ruby 插值結尾處放置減號,以移除 HTML 輸出中尾隨的回車符。
  • 已將 grouped_collection_select 輔助方法新增至 Action View。
  • 已新增 content_for?,讓您可以在渲染之前檢查檢視中是否存在內容。
  • :value => nil 傳遞給表單輔助方法,會將欄位的 value 屬性設定為 nil,而不是使用預設值。
  • :id => nil 傳遞給表單輔助方法,將會使這些欄位在渲染時不帶 id 屬性。
  • :alt => nil 傳遞給 image_tag 將會使 img 標籤在渲染時不帶 alt 屬性。

8 Active Model

Active Model 是 Rails 3.0 中的新功能。它為任何 ORM 函式庫提供一個抽象層,透過實作 Active Model 介面來與 Rails 互動。

8.1 ORM 抽象化和 Action Pack 介面

解耦核心組件的一部分是從 Action Pack 中提取所有與 Active Record 的關聯。這項任務現已完成。所有新的 ORM 外掛程式現在只需要實作 Active Model 介面,即可與 Action Pack 無縫協作。

更多資訊:- 讓任何 Ruby 物件感覺像 ActiveRecord

8.2 驗證

驗證已從 Active Record 移至 Active Model,為 Rails 3 中的所有 ORM 函式庫提供跨越的驗證介面。

  • 現在有一個 validates :attribute, options_hash 快捷方式方法,讓您可以為所有 validates 類別方法傳遞選項,您可以為一個驗證方法傳遞多個選項。
  • validates 方法有以下選項
    • :acceptance => Boolean.
    • :confirmation => Boolean.
    • :exclusion => { :in => Enumerable }.
    • :inclusion => { :in => Enumerable }.
    • :format => { :with => Regexp, :on => :create }.
    • :length => { :maximum => Fixnum }.
    • :numericality => Boolean.
    • :presence => Boolean.
    • :uniqueness => Boolean.

Rails 2.3 版風格的所有驗證方法在 Rails 3.0 中仍然支援,新的 validates 方法旨在作為模型驗證的額外輔助,而不是取代現有的 API。

您也可以傳入一個驗證器物件,然後您可以在使用 Active Model 的物件之間重複使用。

class TitleValidator < ActiveModel::EachValidator
  Titles = ['Mr.', 'Mrs.', 'Dr.']
  def validate_each(record, attribute, value)
    unless Titles.include?(value)
      record.errors[attribute] << 'must be a valid title'
    end
  end
end
class Person
  include ActiveModel::Validations
  attr_accessor :title
  validates :title, :presence => true, :title => true
end

# Or for Active Record

class Person < ActiveRecord::Base
  validates :title, :presence => true, :title => true
end

也支援內省。

User.validators
User.validators_on(:login)

更多資訊

9 Active Record

Active Record 在 Rails 3.0 中受到許多關注,包括抽象化為 Active Model、使用 Arel 完全更新查詢介面、驗證更新,以及許多增強功能和修復。所有 Rails 2.x API 將透過相容層使用,該相容層將支援到 3.1 版。

9.1 查詢介面

Active Record 透過使用 Arel,現在會在其核心方法上傳回關聯。Rails 2.3.x 中現有的 API 仍然受到支援,直到 Rails 3.1 才會棄用,並且直到 Rails 3.2 才會移除,然而,新的 API 提供了以下新的方法,這些方法都會傳回關聯,讓它們可以鏈結在一起。

  • where - 提供關於關聯的條件,傳回什麼內容。
  • select - 選擇您希望從資料庫傳回的模型屬性。
  • group - 依據提供的屬性分組關聯。
  • having - 提供一個表示式,限制群組關聯(GROUP BY 限制)。
  • joins - 將關聯與另一個表格聯結。
  • clause - 提供一個表示式,限制聯結關聯(JOIN 限制)。
  • includes - 包含預先載入的其他關聯。
  • order - 依據提供的表示式排序關聯。
  • limit - 將關聯限制為指定的記錄數。
  • lock - 鎖定從表格傳回的記錄。
  • readonly - 傳回資料的唯讀副本。
  • from - 提供一種從多個表格中選擇關聯的方式。
  • scope - (先前為 named_scope) 傳回關聯,並且可以與其他關聯方法鏈結在一起。
  • with_scope - 和 with_exclusive_scope 現在也會傳回關聯,因此可以鏈結。
  • default_scope - 也適用於關聯。

更多資訊

9.2 增強功能

  • 已將 :destroyed? 新增至 Active Record 物件。
  • 已將 :inverse_of 新增至 Active Record 關聯,讓您可以提取已經載入的關聯的實例,而無需訪問資料庫。

9.3 修補程式和棄用

此外,Active Record 分支中還有許多修復。

  • 已捨棄 SQLite 2 的支援,改用 SQLite 3。
  • MySQL 支援欄位順序。
  • PostgreSQL 轉接器已修復其 TIME ZONE 支援,因此不再插入錯誤的值。
  • 支援 PostgreSQL 表格名稱中的多個結構描述。
  • PostgreSQL 支援 XML 資料類型欄位。
  • table_name 現在已快取。
  • 在 Oracle 轉接器上也做了大量工作,並修復了許多錯誤。

以及以下棄用:

  • Active Record 類別中的 named_scope 已棄用,並已重新命名為僅 scope
  • scope 方法中,您應該改用關聯方法,而不是 :conditions => {} 查找方法,例如 scope :since, lambda {|time| where("created_at > ?", time) }
  • save(false) 已棄用,改用 save(:validate => false)
  • Active Record 的 I18n 錯誤訊息應從 :en.activerecord.errors.template 變更為 :en.errors.template
  • model.errors.on 已棄用,改用 model.errors[]
  • validates_presence_of => validates... :presence => true
  • ActiveRecord::Base.colorize_loggingconfig.active_record.colorize_logging 已棄用,改用 Rails::LogSubscriber.colorize_loggingconfig.colorize_logging

雖然狀態機的實作已在 Active Record edge 中存在幾個月,但它已從 Rails 3.0 版本中移除。

10 Active Resource

Active Resource 也被提取到 Active Model 中,讓您可以無縫地將 Active Resource 物件與 Action Pack 一起使用。

  • 透過 Active Model 新增驗證。
  • 新增觀察掛鉤。
  • HTTP 代理支援。
  • 新增摘要驗證支援。
  • 將模型命名移至 Active Model。
  • 將 Active Resource 屬性變更為具有不區分大小寫存取的 Hash。
  • 為等效的尋找範圍新增 firstlastall 別名。
  • 如果沒有傳回任何內容,find_every 現在不會傳回 ResourceNotFound 錯誤。
  • 新增 save!,除非物件 valid?,否則會引發 ResourceInvalid
  • update_attributeupdate_attributes 新增至 Active Resource 模型。
  • 新增 exists?
  • SchemaDefinition 重新命名為 Schema,並將 define_schema 重新命名為 schema
  • 使用 Active Resources 的 format,而不是遠端錯誤的 content-type 來載入錯誤。
  • 針對結構描述區塊使用 instance_eval
  • 修復當 @response 不回應 #code 或 #message 時 ActiveResource::ConnectionError#to_s 的問題,處理 Ruby 1.9 相容性。
  • 新增 JSON 格式錯誤的支援。
  • 確保 load 可與數值陣列一起使用。
  • 將遠端資源的 410 回應識別為該資源已被刪除。
  • 新增在 Active Resource 連線上設定 SSL 選項的功能。
  • 設定連線逾時也會影響 Net::HTTP open_timeout

棄用

  • save(false) 已棄用,改用 save(:validate => false)
  • Ruby 1.9.2:URI.parse.decode 已棄用,並且不再在函式庫中使用。

11 Active Support

Active Support 中進行了大量努力以使其可選取,也就是說,您不再需要要求整個 Active Support 函式庫來取得其中的一部分。這讓 Rails 的各種核心元件能夠更精簡地執行。

以下是 Active Support 中的主要變更:

  • 大量清理函式庫,移除整個過程中未使用的函式。
  • Active Support 不再提供 TZInfo、Memcache Client 和 Builder 的廠商版本。這些都包含為相依性,並透過 bundle install 命令安裝。
  • 安全緩衝區在 ActiveSupport::SafeBuffer 中實作。
  • 新增 Array.uniq_byArray.uniq_by!
  • 移除 Array#rand,並從 Ruby 1.9 回溯移植 Array#sample
  • 修復 TimeZone.seconds_to_utc_offset 傳回錯誤值的錯誤。
  • 新增 ActiveSupport::Notifications 中介軟體。
  • ActiveSupport.use_standard_json_time_format 現在預設為 true。
  • ActiveSupport.escape_html_entities_in_json 現在預設為 false。
  • Integer#multiple_of? 接受零作為引數,除非接收者為零,否則傳回 false。
  • string.chars 已重新命名為 string.mb_chars
  • ActiveSupport::OrderedHash 現在可以透過 YAML 反序列化。
  • 使用 LibXML 和 Nokogiri 為 XmlMini 新增基於 SAX 的剖析器。
  • 新增了 Object#presence 方法,如果物件 #present? 則回傳該物件,否則回傳 nil
  • 新增了 String#exclude? 核心擴充,回傳 #include? 的相反值。
  • ActiveSupport 中,將 to_i 加入 DateTime,以便讓 to_yaml 在具有 DateTime 屬性的模型上能正確運作。
  • 新增了 Enumerable#exclude?,以與 Enumerable#include? 對應,並避免使用 if !x.include?
  • 切換為預設開啟 Rails 的 XSS 跳脫。
  • 支援 ActiveSupport::HashWithIndifferentAccess 中的深層合併。
  • Enumerable#sum 現在可適用於所有可列舉物件,即使它們沒有回應 :size
  • 長度為零的持續時間上的 inspect 會回傳 '0 seconds' 而不是空字串。
  • elementcollection 加入 ModelName
  • String#to_timeString#to_datetime 處理小數秒。
  • 新增對環繞過濾器物件的新回呼支援,這些物件回應 :before:after,用於 before 和 after 回呼。
  • ActiveSupport::OrderedHash#to_a 方法回傳一個排序過的陣列集合。與 Ruby 1.9 的 Hash#to_a 相符。
  • MissingSourceFile 以常數存在,但現在只是等於 LoadError
  • 新增 Class#class_attribute,以便宣告一個類別層級的屬性,其值可繼承並可被子類別覆寫。
  • 最終移除了 ActiveRecord::Associations 中的 DeprecatedCallbacks
  • Object#metaclass 現在是 Kernel#singleton_class 以符合 Ruby。

以下方法已被移除,因為它們現在已在 Ruby 1.8.7 和 1.9 中提供。

  • Integer#even?Integer#odd?
  • String#each_char
  • String#start_with?String#end_with? (仍保留第三人稱別名)
  • String#bytesize
  • Object#tap
  • Symbol#to_proc
  • Object#instance_variable_defined?
  • Enumerable#none?

REXML 的安全修補程式仍保留在 Active Support 中,因為 Ruby 1.8.7 的早期修補程式層級仍然需要它。Active Support 知道是否需要應用它。

以下方法已被移除,因為它們在框架中不再使用

  • Kernel#daemonize
  • Object#remove_subclasses_ofObject#extend_with_included_modules_fromObject#extended_by
  • Class#remove_class
  • Regexp#number_of_capturesRegexp.unoptionalizeRegexp.optionalizeRegexp#number_of_captures

12 Action Mailer

Action Mailer 已被賦予新的 API,TMail 已被新的 Mail 取代為電子郵件函式庫。Action Mailer 本身已幾乎完全重寫,幾乎每一行程式碼都有變動。結果是,Action Mailer 現在只是繼承自 Abstract Controller,並將 Mail gem 包裝在 Rails DSL 中。這大幅減少了 Action Mailer 中的程式碼量以及其他函式庫的重複。

  • 預設情況下,所有郵件器現在都在 app/mailers 中。
  • 現在可以使用新的 API 通過三個方法發送電子郵件:attachmentsheadersmail
  • Action Mailer 現在原生支援使用 attachments.inline 方法的內嵌附件。
  • Action Mailer 電子郵件方法現在回傳 Mail::Message 物件,然後可以對其發送 deliver 訊息來自行發送。
  • 所有傳遞方法現在都抽象化到 Mail gem。
  • 郵件傳遞方法可以接受一個雜湊,其中包含所有有效的郵件標頭欄位及其值對。
  • mail 傳遞方法的作用方式與 Action Controller 的 respond_to 類似,您可以顯式或隱式地呈現範本。Action Mailer 將根據需要將電子郵件轉換為多部分電子郵件。
  • 您可以將 proc 傳遞給 mail 區塊中的 format.mime_type 呼叫,並顯式呈現特定類型的文字,或新增佈局或不同的範本。proc 中的 render 呼叫來自 Abstract Controller,並支援相同的選項。
  • 郵件器單元測試已移至功能測試。
  • Action Mailer 現在將標頭欄位和主體的自動編碼全部委派給 Mail Gem
  • Action Mailer 將為您自動編碼電子郵件主體和標頭

棄用

  • :charset:content_type:mime_version:implicit_parts_order 都已棄用,轉而使用 ActionMailer.default :key => value 樣式的宣告。
  • 郵件器動態 create_method_namedeliver_method_name 已棄用,只需呼叫 method_name,它現在會回傳一個 Mail::Message 物件。
  • ActionMailer.deliver(message) 已棄用,只需呼叫 message.deliver
  • template_root 已棄用,從 mail 生成區塊內 format.mime_type 方法中的 proc 傳遞選項給 render 呼叫
  • 用於定義實例變數的 body 方法已棄用(body {:ivar => value}),只需在方法中直接宣告實例變數,它們將在視圖中可用。
  • 郵件器位於 app/models 中已棄用,請改用 app/mailers

更多資訊

13 貢獻者

請參閱 Rails 的完整貢獻者列表,了解許多花費大量時間製作 Rails 3 的人。向他們所有人致敬。

Rails 3.0 發行說明由 Mikel Lindsaar 編寫。



返回頂部