1 升級至 Rails 4.0
如果您要升級現有的應用程式,最好先有良好的測試涵蓋範圍。您也應該先升級至 Rails 3.2(如果您尚未升級),並在嘗試更新至 Rails 4.0 之前,確保您的應用程式仍然如預期般執行。升級時需要注意的事項清單可在升級 Ruby on Rails指南中找到。
2 建立 Rails 4.0 應用程式
# You should have the 'rails' RubyGem installed
$ rails new myapp
$ cd myapp
2.1 供應商化 Gems
Rails 現在在應用程式根目錄中使用 Gemfile
來判斷您的應用程式啟動所需的 gems。此 Gemfile
由 Bundler gem 處理,然後安裝所有相依性。它甚至可以將所有相依性本地安裝到您的應用程式,使其不依賴於系統 gems。
更多資訊:Bundler 首頁
2.2 走在最前線
Bundler
和 Gemfile
讓使用新的專用 bundle
命令凍結您的 Rails 應用程式變得輕而易舉。如果您想直接從 Git 儲存庫捆綁,您可以傳遞 --edge
旗標
$ rails new myapp --edge
如果您有 Rails 儲存庫的本機簽出,並且想使用它來產生應用程式,您可以傳遞 --dev
旗標
$ ruby /path/to/rails/railties/bin/rails new myapp --dev
3 主要功能
3.1 升級
- Ruby 1.9.3 (commit) - 偏好 Ruby 2.0;需要 1.9.3+ 版本
- 新的棄用政策 - 已棄用的功能在 Rails 4.0 中會出現警告,並將在 Rails 4.1 中移除。
- ActionPack 頁面和動作快取 (commit) - 頁面和動作快取已提取至單獨的 gem。頁面和動作快取需要太多手動干預(在基礎模型物件更新時手動過期快取)。請改用俄羅斯娃娃快取。
- ActiveRecord 觀察器 (commit) - 觀察器已提取至單獨的 gem。觀察器僅適用於頁面和動作快取,並且可能導致義大利麵式的程式碼。
- ActiveRecord 會話儲存 (commit) - ActiveRecord 會話儲存已提取至單獨的 gem。將會話儲存在 SQL 中代價高昂。請改用 Cookie 會話、Memcache 會話或自訂會話儲存。
- ActiveModel 大量指派保護 (commit) - Rails 3 大量指派保護已棄用。請改用強參數。
- ActiveResource (commit) - ActiveResource 已提取至單獨的 gem。ActiveResource 並未廣泛使用。
- 移除 vendor/plugins (commit) - 使用
Gemfile
來管理已安裝的 gems。
3.2 ActionPack
- 強參數 (commit) - 僅允許授權的參數更新模型物件 (
params.permit(:title, :text)
)。 - 路由考量 (commit) - 在路由 DSL 中,分解出常用的子路由 (
comments
從/posts/1/comments
和/videos/1/comments
)。 - ActionController::Live (commit) - 使用
response.stream
來串流 JSON。 - 宣告式 ETags (commit) - 新增控制器層級的 etag 新增項目,這些新增項目將成為動作 etag 計算的一部分。
- 俄羅斯娃娃快取 (commit) - 快取巢狀的視圖片段。每個片段都基於一組相依性(快取金鑰)過期。快取金鑰通常是範本版本號碼和模型物件。
- Turbolinks (commit) - 僅提供一個初始 HTML 頁面。當使用者導覽至另一個頁面時,使用 pushState 來更新 URL,並使用 AJAX 來更新標題和內文。
- 將 ActionView 從 ActionController 解耦 (commit) - ActionView 已從 ActionPack 解耦,並將在 Rails 4.1 中移至單獨的 gem。
- 不依賴於 ActiveModel (commit) - ActionPack 不再依賴於 ActiveModel。
3.3 一般
- ActiveModel::Model (commit) -
ActiveModel::Model
是一個混入,可讓一般的 Ruby 物件與 ActionPack 直接搭配使用 (例如,用於form_for
) - 新的範圍 API (commit) - 範圍必須始終使用可呼叫項目。
- 結構描述快取傾印 (commit) - 為了改善 Rails 的啟動時間,不直接從資料庫載入結構描述,而是從傾印檔案載入結構描述。
- 支援指定交易隔離層級 (commit) - 選擇可重複讀取或效能改善(較少鎖定)哪個更重要。
- Dalli (commit) - 將 Dalli memcache 用戶端用於 memcache 儲存。
- 通知開始和完成 (commit) - Active Support instrumentation 會將開始和完成通知報告給訂閱者。
- 預設為執行緒安全 (commit) - Rails 可以在執行緒化的應用程式伺服器中執行,而無需額外設定。
檢查您使用的 gems 是否為執行緒安全。
- PATCH 動詞 (commit) - 在 Rails 中,PATCH 取代 PUT。PATCH 用於資源的部分更新。
3.4 安全性
- match 不會全部捕獲 (commit) - 在路由 DSL 中,match 需要指定 HTTP 動詞或動詞。
- 預設逸出 HTML 實體 (commit) - 在 erb 中呈現的字串會逸出,除非使用
raw
包裝或呼叫html_safe
。 - 新的安全性標頭 (commit) - Rails 會在每個 HTTP 要求中傳送以下標頭:
X-Frame-Options
(透過禁止瀏覽器在框架中嵌入頁面來防止點擊劫持)、X-XSS-Protection
(要求瀏覽器停止指令碼注入)和X-Content-Type-Options
(防止瀏覽器將 jpeg 開啟為 exe)。
4 功能提取至 gems
在 Rails 4.0 中,已將多個功能提取到 gems 中。您只需將提取的 gems 新增至您的 Gemfile
即可恢復該功能。
- 基於雜湊 (Hash-based) & 動態查詢方法 (GitHub)
- Active Record 模型中的大量賦值保護 (GitHub, Pull Request)
- ActiveRecord::SessionStore (GitHub, Pull Request)
- Active Record Observers (GitHub, Commit)
- Active Resource (GitHub, Pull Request, Blog)
- Action Caching (GitHub, Pull Request)
- Page Caching (GitHub, Pull Request)
- Sprockets (GitHub)
- 效能測試 (GitHub, Pull Request)
5 文件
指南已使用 GitHub Flavored Markdown 重新編寫。
指南具有響應式設計。
6 Railties
請參閱 變更日誌 以取得詳細的變更資訊。
6.1 重要變更
新的測試位置
test/models
、test/helpers
、test/controllers
和test/mailers
。同時新增了對應的 rake 任務。( Pull Request )您的應用程式可執行檔現在位於
bin/
目錄中。執行rake rails:update:bin
以取得bin/bundle
、bin/rails
和bin/rake
。預設啟用執行緒安全 (Threadsafe)。
已移除透過將
--builder
(或-b
) 傳遞給rails new
來使用自訂建構器的能力。請考慮改用應用程式範本。( Pull Request )
6.2 棄用
config.threadsafe!
已棄用,改用config.eager_load
,它可對預先載入的內容提供更精細的控制。Rails::Plugin
已移除。請勿將外掛程式新增至vendor/plugins
,改用 gem 或具有路徑或 Git 依賴性的 bundler。
7 Action Mailer
請參閱 變更日誌 以取得詳細的變更資訊。
7.1 重要變更
7.2 棄用
8 Active Model
請參閱 變更日誌 以取得詳細的變更資訊。
8.1 重要變更
新增
ActiveModel::ForbiddenAttributesProtection
,這是一個簡單的模組,用於保護屬性在傳遞未允許的屬性時免於大量賦值。新增
ActiveModel::Model
,這是一個 mixin,用於使 Ruby 物件可以開箱即用地與 Action Pack 搭配使用。
8.2 棄用
9 Active Support
請參閱 變更日誌 以取得詳細的變更資訊。
9.1 重要變更
在
ActiveSupport::Cache::MemCacheStore
中,將已棄用的memcache-client
gem 取代為dalli
。最佳化
ActiveSupport::Cache::Entry
以減少記憶體和處理開銷。現在可以為每個地區設定定義屈折變化。
singularize
和pluralize
接受地區設定作為額外的引數。如果接收物件未實作該方法,
Object#try
現在會傳回 nil 而不是引發 NoMethodError,但您仍然可以使用新的Object#try!
來取得舊行為。當給定無效日期時,
String#to_date
現在會引發ArgumentError: invalid date
而不是NoMethodError: undefined method 'div' for nil:NilClass
。它現在與Date.parse
相同,並且它接受比 3.x 更多無效日期,例如# ActiveSupport 3.x "asdf".to_date # => NoMethodError: undefined method `div' for nil:NilClass "333".to_date # => NoMethodError: undefined method `div' for nil:NilClass # ActiveSupport 4 "asdf".to_date # => ArgumentError: invalid date "333".to_date # => Fri, 29 Nov 2013
9.2 棄用
棄用
ActiveSupport::TestCase#pending
方法,改用 minitest 的skip
。由於缺乏執行緒安全性,
ActiveSupport::Benchmarkable#silence
已棄用。它將在 Rails 4.1 中移除,並且不提供替代方案。ActiveSupport::JSON::Variable
已棄用。為自訂 JSON 字串常值定義您自己的#as_json
和#encode_json
方法。棄用相容性方法
Module#local_constant_names
,改用Module#local_constants
(它會傳回符號)。ActiveSupport::BufferedLogger
已棄用。請使用ActiveSupport::Logger
或 Ruby 標準程式庫的記錄器。棄用
assert_present
和assert_blank
,改用assert object.blank?
和assert object.present?
10 Action Pack
請參閱 變更日誌 以取得詳細的變更資訊。
10.1 重要變更
- 變更開發模式下例外狀況頁面的樣式表。此外,在所有例外狀況頁面中也顯示引發例外狀況的程式碼行和程式碼片段。
10.2 棄用
11 Active Record
請參閱 變更日誌 以取得詳細的變更資訊。
11.1 重要變更
改進撰寫
change
遷移的方式,使舊的up
和down
方法不再必要。新增 PostgreSQL 陣列類型支援。任何資料類型都可用於建立陣列欄位,並提供完整的遷移和結構描述傾印器支援。
新增
Relation#load
以明確載入記錄並傳回self
。Model.all
現在會傳回ActiveRecord::Relation
,而不是記錄陣列。如果您真的需要陣列,請使用Relation#to_a
。在某些特定情況下,這可能會在升級時導致損壞。新增
ActiveRecord::Migration.check_pending!
,如果遷移擱置中則會引發錯誤。新增
ActiveRecord::Store
的自訂編碼器支援。現在您可以像這樣設定自訂編碼器store :settings, accessors: [ :color, :homepage ], coder: JSON
mysql
和mysql2
連線預設會設定SQL_MODE=STRICT_ALL_TABLES
,以避免無聲的資料遺失。這可以透過在您的database.yml
中指定strict: false
來停用。移除 IdentityMap。
移除 EXPLAIN 查詢的自動執行。不再使用選項
active_record.auto_explain_threshold_in_seconds
,應將其移除。新增
ActiveRecord::NullRelation
和ActiveRecord::Relation#none
,為 Relation 類別實作空物件模式。新增
create_join_table
遷移協助程式,以建立 HABTM 聯結資料表。允許建立 PostgreSQL hstore 記錄。
11.2 棄用
已棄用舊式基於雜湊的查詢器 API。這表示先前接受「查詢器選項」的方法不再接受。
除了
find_by_...
和find_by_...!
之外,所有動態方法都已棄用。以下是如何重寫程式碼的方法- 可以使用
where(...)
重寫find_all_by_...
。 - 可以使用
where(...).last
重寫find_last_by_...
。 - 可以使用
where(...)
重寫scoped_by_...
。 - 可以使用
find_or_initialize_by(...)
重寫find_or_initialize_by_...
。 - 可以使用
find_or_create_by(...)
重寫find_or_create_by_...
。 - 可以使用
find_or_create_by!(...)
重寫find_or_create_by_...!
。
- 可以使用
12 貢獻者
請參閱 Rails 完整貢獻者清單,其中列出了許多人花費許多時間使 Rails 成為一個穩定且強大的框架。向他們所有人致敬。