更多資訊請至 rubyonrails.org:

Ruby on Rails 4.0 發行版本說明

Rails 4.0 的重點

  • 偏好 Ruby 2.0;需要 1.9.3+ 版本
  • 強參數
  • Turbolinks
  • 俄羅斯娃娃快取

這些發行版本說明僅涵蓋主要變更。若要瞭解各種錯誤修正和變更,請參閱變更記錄或查看 GitHub 上主要 Rails 儲存庫中的提交清單

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。此 GemfileBundler gem 處理,然後安裝所有相依性。它甚至可以將所有相依性本地安裝到您的應用程式,使其不依賴於系統 gems。

更多資訊:Bundler 首頁

2.2 走在最前線

BundlerGemfile 讓使用新的專用 bundle 命令凍結您的 Rails 應用程式變得輕而易舉。如果您想直接從 Git 儲存庫捆綁,您可以傳遞 --edge 旗標

$ rails new myapp --edge

如果您有 Rails 儲存庫的本機簽出,並且想使用它來產生應用程式,您可以傳遞 --dev 旗標

$ ruby /path/to/rails/railties/bin/rails new myapp --dev

3 主要功能

Rails 4.0

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 即可恢復該功能。

5 文件

  • 指南已使用 GitHub Flavored Markdown 重新編寫。

  • 指南具有響應式設計。

6 Railties

請參閱 變更日誌 以取得詳細的變更資訊。

6.1 重要變更

  • 新的測試位置 test/modelstest/helperstest/controllerstest/mailers。同時新增了對應的 rake 任務。( Pull Request )

  • 您的應用程式可執行檔現在位於 bin/ 目錄中。執行 rake rails:update:bin 以取得 bin/bundlebin/railsbin/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 以減少記憶體和處理開銷。

  • 現在可以為每個地區設定定義屈折變化。singularizepluralize 接受地區設定作為額外的引數。

  • 如果接收物件未實作該方法,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_presentassert_blank,改用 assert object.blank?assert object.present?

10 Action Pack

請參閱 變更日誌 以取得詳細的變更資訊。

10.1 重要變更

  • 變更開發模式下例外狀況頁面的樣式表。此外,在所有例外狀況頁面中也顯示引發例外狀況的程式碼行和程式碼片段。

10.2 棄用

11 Active Record

請參閱 變更日誌 以取得詳細的變更資訊。

11.1 重要變更

  • 改進撰寫 change 遷移的方式,使舊的 updown 方法不再必要。

    • 只要給定必要的資訊,drop_tableremove_column 方法現在是可逆的。remove_column 方法過去接受多個欄位名稱;請改用 remove_columns (這是不可逆的)。只要其區塊未呼叫 removechangechange_defaultchange_table 方法也是可逆的。
    • 新的 reversible 方法可讓您指定在向上或向下遷移時要執行的程式碼。請參閱 遷移指南
    • 新的 revert 方法將會還原整個遷移或給定的區塊。如果向下遷移,則會正常執行給定的遷移/區塊。請參閱 遷移指南
  • 新增 PostgreSQL 陣列類型支援。任何資料類型都可用於建立陣列欄位,並提供完整的遷移和結構描述傾印器支援。

  • 新增 Relation#load 以明確載入記錄並傳回 self

  • Model.all 現在會傳回 ActiveRecord::Relation,而不是記錄陣列。如果您真的需要陣列,請使用 Relation#to_a。在某些特定情況下,這可能會在升級時導致損壞。

  • 新增 ActiveRecord::Migration.check_pending!,如果遷移擱置中則會引發錯誤。

  • 新增 ActiveRecord::Store 的自訂編碼器支援。現在您可以像這樣設定自訂編碼器

    store :settings, accessors: [ :color, :homepage ], coder: JSON
    
  • mysqlmysql2 連線預設會設定 SQL_MODE=STRICT_ALL_TABLES,以避免無聲的資料遺失。這可以透過在您的 database.yml 中指定 strict: false 來停用。

  • 移除 IdentityMap。

  • 移除 EXPLAIN 查詢的自動執行。不再使用選項 active_record.auto_explain_threshold_in_seconds,應將其移除。

  • 新增 ActiveRecord::NullRelationActiveRecord::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 成為一個穩定且強大的框架。向他們所有人致敬。



回到頂端