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 供應商寶石
Rails 現在在應用程式根目錄中使用 Gemfile
來確定您的應用程式啟動所需的寶石。此 Gemfile
由 Bundler 寶石處理,然後安裝您的所有相依性。它甚至可以將所有相依性安裝到您的應用程式中,這樣就不會依賴系統寶石。
更多資訊:Bundler 主頁
2.2 處於邊緣
Bundler
和 Gemfile
使得凍結您的 Rails 應用程式變得非常容易,就像使用新的專用 bundle
指令一樣。如果您想直接從 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 (提交) - 優先使用 Ruby 2.0;需要 1.9.3+
- 新的棄用政策 - 已棄用的功能在 Rails 4.0 中是警告,並會在 Rails 4.1 中移除。
- ActionPack 頁面和動作快取 (提交) - 頁面和動作快取已抽取到一個獨立的 gem。頁面和動作快取需要太多手動介入(在底層模型物件更新時手動讓快取過期)。改用 Russian doll 快取。
- ActiveRecord 觀察器 (提交) - 觀察器已抽取到一個獨立的 gem。觀察器只在頁面和動作快取中需要,而且會導致程式碼雜亂。
- ActiveRecord 會話儲存 (提交) - ActiveRecord 會話儲存已抽取到一個獨立的 gem。在 SQL 中儲存會話很耗費成本。改用 cookie 會話、memcache 會話或自訂的會話儲存。
- ActiveModel 大量指派保護 (提交) - Rails 3 大量指派保護已棄用。改用強參數。
- ActiveResource (提交) - ActiveResource 已抽取到一個獨立的 gem。ActiveResource 並未廣泛使用。
- 移除 vendor/plugins (提交) - 使用
Gemfile
來管理已安裝的 gem。
3.2 ActionPack
- 強參數 (提交) - 只允許已核准的參數來更新模型物件(
params.permit(:title, :text)
)。 - 路由問題 (提交) - 在路由 DSL 中,分解出常見的子路由(
/posts/1/comments
和/videos/1/comments
中的comments
)。 - ActionController::Live (提交) - 使用
response.stream
串流 JSON。 - 宣告式 ETag (提交) - 加入控制器層級的 etag 新增,這會成為動作 etag 計算的一部分。
- 俄羅斯娃娃快取 (提交) - 快取巢狀的檢視片段。每個片段會根據一組相依性(快取金鑰)到期。快取金鑰通常是範本版本號碼和模型物件。
- Turbolinks (提交) - 只提供一個初始 HTML 頁面。當使用者導覽到其他頁面時,使用 pushState 更新網址,並使用 AJAX 更新標題和主體。
- 將 ActionView 與 ActionController 分離 (提交) - ActionView 已與 ActionPack 分離,並會在 Rails 4.1 中移至一個獨立的 gem。
- 不依賴 ActiveModel (提交) - ActionPack 不再依賴 ActiveModel。
3.3 一般
- ActiveModel::Model (提交) -
ActiveModel::Model
,一個混入模組,讓一般的 Ruby 物件能與 ActionPack 直接搭配使用(例如form_for
) - 新的範圍 API (提交) - 範圍必須始終使用可呼叫物件。
- Schema 快取傾印 (提交) - 為了改善 Rails 開機時間,改為從傾印檔案載入 schema,而不是直接從資料庫載入 schema。
- 支援指定交易隔離層級 (提交) - 選擇可重複讀取或改善效能(較少鎖定)哪個較重要。
- Dalli (提交) - 使用 Dalli memcache 程式庫作為 memcache 儲存。
- 通知開始和結束 (提交) - Active Support 儀器會向訂閱者回報開始和結束通知。
- 預設為執行緒安全 (提交) - Rails 可以執行於執行緒應用程式伺服器,而無需額外設定。
檢查您使用的 gem 是否為執行緒安全。
- PATCH 動詞 (提交) - 在 Rails 中,PATCH 取代 PUT。PATCH 用於資源的部分更新。
3.4 安全性
- match 不會捕捉全部 (提交) - 在路由 DSL 中,match 需要指定 HTTP 動詞或動詞。
- 預設轉譯 HTML 實體 (提交) - 在 erb 中呈現的字串會被轉譯,除非使用
raw
包覆或呼叫html_safe
。 - 新的安全標頭 (提交) - Rails 會在每個 HTTP 要求中傳送下列標頭:
X-Frame-Options
(禁止瀏覽器將頁面嵌入在框架中,以防止點擊劫持)、X-XSS-Protection
(要求瀏覽器停止腳本注入)和X-Content-Type-Options
(防止瀏覽器將 jpeg 開啟為 exe)。
4 將功能萃取到寶石中
在 Rails 4.0 中,已將多項功能萃取到寶石中。您只要將萃取出的寶石新增到 Gemfile
中,即可取回功能。
- 基於雜湊和動態的尋找器方法 (GitHub)
- Active Record 模型中的大量指定保護 (GitHub, Pull Request)
- ActiveRecord::SessionStore (GitHub, Pull Request)
- Active Record 觀察者 (GitHub, 提交)
- Active Resource (GitHub, Pull Request, 部落格)
- 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
。預設為執行緒安全
已移除傳遞
--builder
(或-b
)給rails new
以使用自訂建構器的功能。請考慮改用應用程式範本。(Pull Request)
6.2 已棄用
config.threadsafe!
已棄用,建議改用config.eager_load
,它能更精細地控制急切載入的內容。Rails::Plugin
已消失。請勿將外掛程式新增至vendor/plugins
,改用 gem 或 bundler 搭配路徑或 git 相依性。
7 Action Mailer
有關詳細變更,請參閱 變更記錄。
7.1 顯著變更
7.2 已棄用
8 Active Model
有關詳細變更,請參閱 變更記錄。
8.1 顯著變更
新增
ActiveModel::ForbiddenAttributesProtection
,一個簡單的模組,可在傳遞未允許屬性時,保護屬性免於大量指派。新增
ActiveModel::Model
,一個混入,讓 Ruby 物件能立即與 Action Pack 搭配使用。
8.2 已棄用
9 Active Support
有關詳細變更,請參閱 變更記錄。
9.1 顯著變更
在
ActiveSupport::Cache::MemCacheStore
中,以dalli
取代已棄用的memcache-client
gem。最佳化
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
已被棄用。定義您自己的#as_json
和#encode_json
方法,以自訂 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 已棄用
已棄用舊式基於雜湊的 Finder API。這表示先前接受「Finder 選項」的方法不再接受。
除了
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 成為穩定且強大的架構。向所有這些人致敬。
回饋
我們鼓勵您協助提升本指南的品質。
如果您發現任何錯字或事實錯誤,請協助我們修正。首先,您可以閱讀我們的 文件貢獻 部分。
您也可能會發現不完整或過時的內容。請務必為 main 新增任何遺漏的文件。請務必先查看 Edge Guides,以驗證問題是否已在 main 分支中修正。請查看 Ruby on Rails 指南準則,了解風格和慣例。
如果您發現需要修正之處,但無法自行修正,請 開啟問題。
最後,我們非常歡迎在 官方 Ruby on Rails 論壇 上針對 Ruby on Rails 文件進行任何討論。