安裝 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
取代,請參閱下方的 供應商 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
來決定應用程式啟動所需的寶石。此 Gemfile
由 Bundler 處理,然後安裝所有相依性。它甚至可以將所有相依性安裝到應用程式本機,這樣就不會依賴系統寶石。
更多資訊:- bundler 首頁
2.2 處於邊緣
Bundler
和 Gemfile
讓凍結 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::Translation
和ActiveModel::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/tasks
和 PLUGIN/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_store
在ActionController::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_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
方法有以下選項: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_logging
和config.active_record.colorize_logging
已不建議使用,建議改用Rails::LogSubscriber.colorize_logging
或config.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 屬性變更為具有非區分存取權的雜湊。
- 新增等效尋找範圍的
first
、last
和all
別名。 find_every
現在如果沒有回傳任何內容,就不會回傳ResourceNotFound
錯誤。- 新增
save!
,除非物件為valid?
,否則會引發ResourceInvalid
。 - 將
update_attribute
和update_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_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?
保持一致,並避免使用!x.include?
。 - 切換至預設開啟的 rails XSS 逸出。
- 支援
ActiveSupport::HashWithIndifferentAccess
中的深度合併。 Enumerable#sum
現在適用於所有可列舉物件,即使它們不回應:size
。- 零長度持續時間的
inspect
傳回 '0 秒',而非空字串。 - 新增
element
和collection
至ModelName
。 String#to_time
和String#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 透過三種方法傳送電子郵件:
attachments
、headers
和mail
。 - 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_name
和deliver_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 文件進行任何類型的討論。