若要安裝 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/rails
,rails
命令會偵測到它是在 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
方法已消失,並已由使用 bundler
和 Gemfile
取代,請參閱下面的供應商化 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。此 Gemfile
由 Bundler 處理,然後安裝所有相依性。它甚至可以將所有相依性本機安裝到你的應用程式,使其不依賴於系統 gem。
更多資訊:- bundler 首頁
2.2 使用最新版本
Bundler
和 Gemfile
使用新的專用 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
的建立使得 ActionController
和 ActionMailer
得以大幅簡化,將所有這些函式庫中的通用程式碼移除並放入 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::Translation
和ActiveModel::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/tasks
和 PLUGIN/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_store
在ActionController::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_for
或 div_for
這種從區塊插入內容的輔助方法現在使用 <%=
<%= form_for @post do |f| %>
...
<% end %>
您自己的這類輔助方法應該會傳回字串,而不是手動附加到輸出緩衝區。
像 cache
或 content_for
這種執行其他動作的輔助方法不受此變更影響,它們仍然需要像以前一樣使用 <%
。
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_logging
和config.active_record.colorize_logging
已棄用,改用Rails::LogSubscriber.colorize_logging
或config.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。
- 為等效的尋找範圍新增
first
、last
和all
別名。 - 如果沒有傳回任何內容,
find_every
現在不會傳回ResourceNotFound
錯誤。 - 新增
save!
,除非物件valid?
,否則會引發ResourceInvalid
。 - 將
update_attribute
和update_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_by
和Array.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' 而不是空字串。 - 將
element
和collection
加入ModelName
。 String#to_time
和String#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_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,並將 Mail gem 包裝在 Rails DSL 中。這大幅減少了 Action Mailer 中的程式碼量以及其他函式庫的重複。
- 預設情況下,所有郵件器現在都在
app/mailers
中。 - 現在可以使用新的 API 通過三個方法發送電子郵件:
attachments
、headers
和mail
。 - 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_name
和deliver_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 編寫。