v7.1.3.2
更多資訊請至 rubyonrails.org: 更多 Ruby on Rails

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 開發者的最佳時機。一些亮點是

最重要的是,我們已盡力使用友善的警告來淘汰舊 API。這表示你可以將現有的應用程式移轉至 Rails 3,而不用立即將所有舊程式碼改寫成最新的最佳實務。

這些發行說明涵蓋了主要的升級,但沒有包含每個小錯誤修正和變更。Rails 3.0 由超過 250 位作者提交了近 4,000 個 commit!如果你想查看所有內容,請查看 GitHub 上 Rails 主要存放庫中的commit 清單

安裝 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 取代,請參閱下方的 供應商 Gems

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 供應商 Gems

Rails 現在使用應用程式根目錄中的 Gemfile 來決定應用程式啟動所需的寶石。此 GemfileBundler 處理,然後安裝所有相依性。它甚至可以將所有相依性安裝到應用程式本機,這樣就不會依賴系統寶石。

更多資訊:- bundler 首頁

2.2 處於邊緣

BundlerGemfile 讓凍結 Rails 應用程式變得非常容易,只要使用新的專用 bundle 指令即可,因此 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 已更新,以提供一致的插件 API 給整個 Rails 架構,以及產生器和 Rails 繫結的全面重寫,結果是開發人員現在可以以一致、明確的方式連接到產生器和應用程式架構的任何重要階段。

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

隨著 Merb 和 Rails 的合併,其中一項重要的工作就是移除 Rails 核心元件之間的緊密耦合。這項工作現在已經完成,而且所有 Rails 核心元件現在都使用與您用來開發插件相同的 API。這表示您製作的任何插件,或任何核心元件替換(例如 DataMapper 或 Sequel)都可以存取 Rails 核心元件可以存取的所有功能,並可以隨意延伸和增強。

更多資訊:- The Great Decoupling

3.3 Active Model 抽象

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

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

3.4 控制器抽象

解耦核心元件的另一項重要工作,是建立一個與 HTTP 概念分開的基礎超級類別,以處理檢視的呈現等。建立 `AbstractController` 讓 `ActionController` 和 `ActionMailer` 得以大幅簡化,將所有這些函式庫中的共用程式碼移除,並放入 Abstract Controller。

更多資訊:- Rails Edge 架構

3.5 Arel 整合

Arel(或 Active Relation)已被採用為 Active Record 的基礎,現在 Rails 也需要它。Arel 提供了一個 SQL 抽象,簡化了 Active Record,並提供 Active Record 中關係功能的基礎。

更多資訊:- 我為何撰寫 Arel

3.6 郵件提取

從一開始,Action Mailer 就有 monkey patch、前置剖析器,甚至傳遞和接收器代理程式,此外還將 TMail 販售在原始碼樹中。第 3 版透過將所有與電子郵件訊息相關的功能抽象到 Mail gem 中,來改變這種情況。這再次減少了程式碼重複,並有助於在 Action Mailer 和電子郵件剖析器之間建立可定義的界線。

更多資訊:- Rails 3 中的新 Action Mailer API

4 文件

Rails 樹狀結構中的文件會隨著所有 API 變更而更新,此外,Rails Edge 指南 也會逐一更新,以反映 Rails 3.0 中的變更。不過,guides.rubyonrails.org 上的指南將持續只包含 Rails 的穩定版本(在這個時間點,為 2.3.5 版,直到 3.0 版發布為止)。

更多資訊:- Rails 文件專案

5 國際化

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

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

更多資訊:- Rails 3 I18n 變更

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 部分,而不是在編輯和新檢視中重複程式碼。
  • 架構表單現在使用 f.submit,它會根據傳入物件的狀態傳回「建立 ModelName」或「更新 ModelName」。

最後,在 rake 任務中新增了幾項增強功能

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

Railties 現在已棄用

  • RAILS_ROOT,改用 Rails.root
  • RAILS_ENV,改用 Rails.env,以及
  • RAILS_DEFAULT_LOGGER,改用 Rails.logger

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

更多資訊

7 Action Pack

Action Pack 已進行重大的內部和外部變更。

7.1 抽象控制器

抽象控制器將 Action Controller 的一般部分拉出到可重複使用的模組中,任何函式庫都可以使用它來呈現範本、呈現部分、輔助程式、翻譯、記錄、請求回應週期的任何部分。這個抽象讓 ActionMailer::Base 現在可以從 AbstractController 繼承,並將 Rails DSL 包裝到 Mail gem 上。

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

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

更多資訊:- Rails Edge 架構

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 hash 中設定永久值,方法為 cookie.permanent[:key] => value,如果驗證失敗,會引發簽章值例外狀況。
  • 現在您可以將 :notice => 'This is a flash message':alert => 'Something went wrong' 傳遞給 respond_to 區塊內的 format 呼叫。flash[] hash 仍像以前一樣運作。
  • respond_with 方法已新增到您的控制器中,簡化了老牌的 format 區塊。
  • 新增 ActionController::Responder,讓您能靈活地產生回應。

棄用

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

更多資訊

7.3 Action Dispatch

動作分派是 Rails 3.0 的新功能,提供路由的新穎且更簡潔的實作。

  • 大幅清理並改寫路由器,Rails 路由器現在是具有 Rails DSL 的 rack_mount,它是一個獨立的軟體。
  • 每個應用程式定義的路由現在在您的應用程式模組中命名空間化,即

    # 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 應用程式的萬用路由 (/:controller/:action/:id) 現在已註解掉。
  • 路由 :path_prefix 不再存在,而 :name_prefix 現在會自動在給定值尾端加上「_」。

更多資訊: * Rails 3 路由器:Rack it Up * Rails 3 中的改良路由 * Rails 3 中的通用動作

7.4 動作檢視

7.4.1 不顯眼的 JavaScript

在 Action View 幫手程式中進行了重大的重寫,實作了非侵入式 JavaScript (UJS) 掛勾,並移除舊的內嵌 AJAX 指令。這讓 Rails 能夠使用任何相容的 UJS 驅動程式,在幫手程式中實作 UJS 掛勾。

這表示所有先前的 remote_<method> 幫手程式都已從 Rails 核心移除,並放入 Prototype Legacy Helper 中。若要將 UJS 掛勾放入 HTML 中,現在改傳遞 :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 => nilimage_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 方法有以下選項
    • :acceptance => 布林值.
    • :confirmation => 布林值.
    • :exclusion => { :in => 可列舉 }.
    • :inclusion => { :in => 可列舉 }.
    • :format => { :with => 正規表示式, :on => :create }.
    • :length => { :maximum => 定數 }.
    • :numericality => 布林值.
    • :presence => 布林值.
    • :uniqueness => 布林值.

Rails 3.0 仍支援所有 Rails 版本 2.3 風格的驗證方法,新的驗證方法被設計為模型驗證的額外輔助,而不是現有 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

ActiveRecord 在 Rails 3.0 中獲得許多關注,包括抽象到 Active Model、使用 Arel 對查詢介面進行全面更新、驗證更新,以及許多增強和修正。所有 Rails 2.x API 都可以使用相容性層,該層將支援到 3.1 版。

9.1 查詢介面

ActiveRecord 現在透過使用 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

雖然 State Machine 的實作已在 Active Record edge 中執行數月,但已從 Rails 3.0 版本中移除。

10 Active Resource

Active Resource 也已擷取至 Active Model,讓你可以在 Action Pack 中無縫使用 Active Resource 物件。

  • 透過 Active Model 新增驗證。
  • 新增觀察掛鉤。
  • HTTP 代理支援。
  • 新增對摘要驗證的支援。
  • 將模型命名移至 Active Model。
  • 將 Active Resource 屬性變更為具有非區分存取權的雜湊。
  • 新增等效尋找範圍的 firstlastall 別名。
  • find_every 現在如果沒有回傳任何內容,就不會回傳 ResourceNotFound 錯誤。
  • 新增 save!,除非物件為 valid?,否則會引發 ResourceInvalid
  • update_attributeupdate_attributes 新增至 Active Resource 模型。
  • 新增 exists?
  • SchemaDefinition 重新命名為 Schema,並將 define_schema 重新命名為 schema
  • 使用 Active Resource 的 format,而非遠端錯誤的 content-type 來載入錯誤。
  • 使用 instance_eval 來處理 schema 區塊。
  • 修正 ActiveResource::ConnectionError#to_s,當 @response 無法回應 #code 或 #message 時,處理 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 已投入大量心力,使其具備 cherry pick 功能,也就是說,您不再需要載入整個 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_iDateTime,因此 to_yaml 可以正確運作於具有 DateTime 屬性的模型。
  • 新增 Enumerable#exclude? 以與 Enumerable#include? 保持一致,並避免使用 !x.include?
  • 切換至預設開啟的 rails XSS 逸出。
  • 支援 ActiveSupport::HashWithIndifferentAccess 中的深度合併。
  • Enumerable#sum 現在適用於所有可列舉物件,即使它們不回應 :size
  • 零長度持續時間的 inspect 傳回 '0 秒',而非空字串。
  • 新增 elementcollectionModelName
  • String#to_timeString#to_datetime 處理小數秒。
  • 新增支援新的回呼,以回應在 before 和 after 回呼中使用的 :before:after,這些回呼用於 around filter 物件。
  • 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_of Object#extend_with_included_modules_from, Object#extended_by
  • Class#remove_class
  • Regexp#number_of_captures, Regexp.unoptionalize, Regexp.optionalize, Regexp#number_of_captures

12 Action Mailer

Action Mailer 已獲得新的 API,其中 TMail 已被新的 Mail 取代為電子郵件函式庫。Action Mailer 本身已獲得幾乎完全的重新撰寫,幾乎每一行程式碼都已變更。結果是 Action Mailer 現在僅繼承自 Abstract Controller,並在 Rails DSL 中包裝 Mail 程式集。這大幅減少了 Action Mailer 中其他函式庫的程式碼和重複。

  • 預設情況下,所有郵件傳送器現在都位於 app/mailers 中。
  • 現在可以使用新的 API 透過三種方法傳送電子郵件:attachmentsheadersmail
  • Action Mailer 現在原生支援使用 attachments.inline 方法的內嵌附件。
  • Action Mailer 電子郵件傳送方法現在會傳回 Mail::Message 物件,然後可以傳送 deliver 訊息給它,讓它自己傳送。
  • 所有傳送方法現在都抽象化到 Mail gem。
  • 郵件傳送方法可以接受包含所有有效郵件標頭欄位及其值對應的雜湊。
  • mail 傳送方法的作用類似於 Action Controller 的 respond_to,而且您可以明確或隱含地呈現範本。Action Mailer 會視需要將電子郵件轉換成多部分電子郵件。
  • 您可以在郵件區塊內的 format.mime_type 呼叫中傳遞一個程序,並明確呈現特定類型的文字,或新增配置或不同的範本。程序內的 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 方法的程序內的呈現呼叫
  • 用於定義實例變數的 body 方法已棄用 (body {:ivar => value}),只要直接在方法中宣告實例變數,它們就會在檢視中可用。
  • 郵件位於 app/models 已棄用,請改用 app/mailers

更多資訊

13 個學分

請參閱 Rails 貢獻者完整清單,了解許多人花費許多時間製作 Rails 3 的情況。向所有這些人致敬。

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

意見回饋

我們鼓勵您協助提升本指南的品質。

如果您發現任何錯字或事實錯誤,請貢獻您的意見。首先,您可以閱讀我們的 文件貢獻 部分。

您也可能會發現不完整或未更新的內容。請務必為 main 新增任何遺漏的文件。請務必先查看 Edge Guides,以驗證問題是否已在 main 分支修復。查看 Ruby on Rails 指南指南 以了解樣式和慣例。

如果您發現需要修復但無法自行修補的任何問題,請 開啟問題

最後但並非最不重要的一點是,我們非常歡迎在 官方 Ruby on Rails 論壇 上針對 Ruby on Rails 文件進行任何類型的討論。